--- loncom/interface/lonsearchcat.pm 2004/03/03 17:25:23 1.204 +++ loncom/interface/lonsearchcat.pm 2004/04/19 21:46:50 1.212 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Search Catalog # -# $Id: lonsearchcat.pm,v 1.204 2004/03/03 17:25:23 matthew Exp $ +# $Id: lonsearchcat.pm,v 1.212 2004/04/19 21:46:50 matthew Exp $ # # Copyright Michigan State University Board of Trustees # @@ -48,7 +48,7 @@ described at http://www.lon-capa.org. lonsearchcat presents the user with an interface to search the LON-CAPA digital library. lonsearchcat also initiates the execution of a search by sending the search parameters to LON-CAPA servers. The progress of -search (on a server basis) is displayed to the user in a seperate window. +search (on a server basis) is displayed to the user in a separate window. =head1 Internals @@ -74,6 +74,7 @@ use Apache::lonmeta; use Apache::lonhtmlcommon; use Apache::lonlocal; use LONCAPA::lonmetadata(); +use HTML::Entities(); ###################################################################### ###################################################################### @@ -164,6 +165,25 @@ sub handler { '_'.&Apache::lonnet::escape($ENV{'user.name'}). '_'.$ENV{'form.persistent_db_id'}.'_persistent_search.db'; ## + &Apache::lonhtmlcommon::clear_breadcrumbs(); + if (exists($ENV{'request.course.id'}) && $ENV{'request.course.id'} ne '') { + &Apache::lonhtmlcommon::add_breadcrumb + ({href=>'/adm/searchcat?'. + 'catalogmode='.$ENV{'form.catalogmode'}. + '&launch='.$ENV{'form.launch'}. + '&mode='.$ENV{'form.mode'}, + text=>"Course and Catalog Search", + bug=>'Searching',}); + } else { + &Apache::lonhtmlcommon::add_breadcrumb + ({href=>'/adm/searchcat?'. + 'catalogmode='.$ENV{'form.catalogmode'}. + '&launch='.$ENV{'form.launch'}. + '&mode='.$ENV{'form.mode'}, + text=>"Catalog Search", + bug=>'Searching',}); + } + # if (! &get_persistent_form_data($persistent_db_file)) { if ($ENV{'form.phase'} =~ /(run_search|results)/) { &Apache::lonnet::logthis("lonsearchcat:Unable to recover data ". @@ -264,6 +284,32 @@ END } $ENV{'form.phase'} = 'disp_basic' if (! exists($ENV{'form.phase'})); $ENV{'form.show'} = 20 if (! exists($ENV{'form.show'})); + # + $ENV{'form.searchmode'} = 'basic'; + if ($ENV{'form.phase'} eq 'adv_search' || + $ENV{'form.phase'} eq 'disp_adv') { + $ENV{'form.searchmode'} = 'advanced'; + } elsif ($ENV{'form.phase'} eq 'course_search') { + $ENV{'form.searchmode'} = 'course_search'; + } + # + if ($ENV{'form.searchmode'} eq 'advanced') { + &Apache::lonhtmlcommon::add_breadcrumb + ({href=>'/adm/searchcat?phase=disp_adv&'. + 'catalogmode='.$ENV{'form.catalogmode'}. + '&launch='.$ENV{'form.launch'}. + '&mode='.$ENV{'form.mode'}, + text=>"Advanced Search", + bug=>'Searching',}); + } elsif ($ENV{'form.searchmode'} eq 'course search') { + &Apache::lonhtmlcommon::add_breadcrumb + ({href=>'/adm/searchcat?phase=disp_adv&'. + 'catalogmode='.$ENV{'form.catalogmode'}. + '&launch='.$ENV{'form.launch'}. + '&mode='.$ENV{'form.mode'}, + text=>"Course Search", + bug=>'Searching',}); + } ## ## Switch on the phase ## @@ -288,19 +334,17 @@ END &course_search($r); } elsif(($ENV{'form.phase'} eq 'basic_search') || ($ENV{'form.phase'} eq 'adv_search')) { - $ENV{'form.searchmode'} = 'basic'; - if ($ENV{'form.phase'} eq 'adv_search') { - $ENV{'form.searchmode'} = 'advanced'; - } # Set up table if (! defined(&create_results_table())) { my $errorstring=&Apache::lonmysql::get_error(); + &Apache::lonnet::logthis('lonsearchcat.pm: Unable to create '. + 'needed table. lonmysql error:'. + $errorstring); $r->print(<Search Error $bodytag Unable to create table in which to store search results. The search has been aborted. -
$errorstring END @@ -454,6 +498,23 @@ sub untiehash { } # End of course search scoping +sub search_html_header { + my $Str = < + +The LearningOnline Network with CAPA + + +ENDHEADER + return $Str; +} + ###################################################################### ###################################################################### @@ -470,27 +531,12 @@ Prints the form for the basic search. S sub print_basic_search_form { my ($r,$closebutton,$hidden_fields) = @_; my $bodytag=&Apache::loncommon::bodytag('Search'). - &Apache::loncommon::help_open_topic('Finding_Resources'). - &Apache::loncommon::help_open_bug('Searching'); - my $scrout=<<"ENDDOCUMENT"; - - -The LearningOnline Network with CAPA - - -$bodytag -ENDDOCUMENT -if (&Apache::lonnet::allowed('bre',$ENV{'request.role.domain'})) { - my $CatalogSearch=&mt('Catalog Search'); - my $Statement=&searchhelp(); - $scrout.=(<$CatalogSearch + &Apache::lonhtmlcommon::breadcrumbs(undef,'Searching','Finding_Resources', + undef,undef,! $ENV{'form.launch'}); + my $scrout = &search_html_header().$bodytag; + if (&Apache::lonnet::allowed('bre',$ENV{'request.role.domain'})) { + my $Statement=&searchhelp(); + $scrout.=(< $hidden_fields @@ -501,20 +547,23 @@ $Statement. @@ -602,66 +651,89 @@ sub print_advanced_search_form{ $closebutton -

END - my $bodytag=&Apache::loncommon::bodytag('Advanced Catalog Search'); + my $bodytag=&Apache::loncommon::bodytag('Advanced Catalog Search'). + &Apache::lonhtmlcommon::breadcrumbs(undef,'Searching', + 'Finding_Resources', + undef,undef, + ! $ENV{'form.launch'}); my $searchhelp=&searchhelp(); - my $scrout=<<"ENDHEADER"; - - -The LearningOnline Network with CAPA - - + my $scrout=&search_html_header(); + $scrout .= <<"ENDHEADER"; $bodytag -$searchhelp $advanced_buttons -$hidden_fields - ENDHEADER - $scrout.=&viewoptions(); + $scrout.=(' 'x2).&viewoptions().'

'.$hidden_fields. + ''; my %fields=&Apache::lonmeta::fieldnames(); - - $scrout.='
ENDDOCUMENT - $scrout.=' '.&Apache::lonhtmlcommon::textbox('basicexp', - $ENV{'form.basicexp'},40). - ' '; - my $relatedcheckbox = &Apache::lonhtmlcommon::checkbox('related', - $ENV{'form.related'}); - my $domain = $r->dir_config('lonDefDomain'); - my $domaincheckbox = &Apache::lonhtmlcommon::checkbox('domains', - $ENV{'form.domains'}); - my $srch=&mt('Search'); - my $header=&mt('Advanced Search'); - my $userelatedwords=&mt('use related words'); - my $onlysearchdomain=&mt('only search domain'); - my $view=&viewoptions(); - $scrout.=<dir_config('lonDefDomain'); + my $domaincheckbox = + &Apache::lonhtmlcommon::checkbox('domains', + $ENV{'form.domains'}); + my $srch=&mt('Search'); + my $header=&mt('Advanced Search'); + my $userelatedwords=&mt('use related words'); + my $onlysearchdomain=&mt('only search domain'); + my $view=&viewoptions(); + $scrout.=<$header
'; - $scrout.="\n"; - foreach ('title','author','owner','authorspace','modifyinguser', - 'keywords','notes','abstract','standards', - 'lowestgradelevel','highestgradelevel','mime') { - $scrout.=''; + # + $scrout.= '

'.$searchhelp.'

'. + "
".&mt('Field').''.&mt('Value').'' - .&mt('Related').'
'.&mt('Words')."
'.&titlefield($fields{$_}).''. - &Apache::lonmeta::prettyinput($_,$ENV{'form.'.$_},$_,'advsearch', - 1,'',$ENV{'form.'.$_.'_related'}). - '
\n"; + my %related_word_search = + ('title'=>1, + 'author'=>0, + 'owner'=>0, + 'authorspace'=>0, + 'modifyinguser'=>0, + 'keywords'=>1, + 'notes'=>1, + 'abstract'=>1, + 'standards'=>1, + 'mime'=>1, + ); + # + foreach my $field ('title','author','owner','authorspace','modifyinguser', + 'keywords','notes','abstract','standards','mime') { + $scrout.=''.$/; + } + foreach my $field ('lowestgradelevel','highestgradelevel') { + $scrout.=''. + ''. + ''.$/; } - $scrout.=''; - $scrout.=''.$/; + $scrout.=''; + ''.$/; + $scrout .= "
'.&titlefield($fields{$field}).''. + &Apache::lonmeta::prettyinput($field, + $ENV{'form.'.$field}, + $field, + 'advsearch', + $related_word_search{$field}, + '', + $ENV{'form.'.$field.'_related'}, + 50); + if ($related_word_search{$field}) { + $scrout .= 'related words'; + } else { + $scrout .= ' '; + } + $scrout .= '
'.&titlefield($fields{$field}).''. + &Apache::lonmeta::prettyinput($field, + $ENV{'form.'.$field}, + $field, + 'advsearch', + 0). + '
'. - &titlefield(&mt('MIME Type Category')).''. + $scrout.='
'. + &titlefield(&mt('MIME Type Category')).''. &Apache::loncommon::filecategoryselect('category', $ENV{'form.category'}). - ' 
'. - &titlefield(&mt('Limit Search to Domains')).''. + '
'. + &titlefield(&mt('Domains')).''. &Apache::loncommon::domain_select('domains', $ENV{'form.domains'},1). - ' 
\n
\n\n"; my %dates=&Apache::lonlocal::texthash ('creationdatestart' => 'Creation Date After', 'creationdateend' => 'Creation Date Before', 'lastrevisiondatestart' => 'Last Revision Date After', 'lastrevisiondateend' => 'Last Revision Date Before'); - foreach (sort keys %dates) { - $scrout.=''. - ''. - ''; + foreach my $field (sort keys %dates) { + $scrout.=''. + ''.$/; } - $scrout.="
'.&titlefield($dates{$_}).''. - &Apache::lonhtmlcommon::date_setter('advsearch',$_,0,'',1). - ' 
'.&titlefield($dates{$field}).''. + &Apache::lonhtmlcommon::date_setter('advsearch',$field,0,'',1). + '
\n"; $scrout.=<'.$title.''; + return $title; } ###################################################################### @@ -735,20 +807,20 @@ Outputs: text for box with view options ###################################################################### ###################################################################### sub viewoptions { - my $scrout="\n\n".''. - '
'.&mt('View Options').''. - &mt('Records per Page').'
'; - unless ($ENV{'form.viewselect'}) { $ENV{'form.viewselect'}='detailed'; } + my $scrout="\n".''; + if (! defined($ENV{'form.viewselect'})) { + $ENV{'form.viewselect'}='detailed'; + } $scrout.=&Apache::lonmeta::selectbox('viewselect', $ENV{'form.viewselect'}, \&viewoptiontext, sort(keys(%Views))); - $scrout.=''; + $scrout.= '  '; $scrout.=&Apache::lonmeta::selectbox('show', $ENV{'form.show'}, undef, (10,20,50,100,1000,10000)); - $scrout.="
\n\n"; + $scrout .= (' 'x2).&mt('Records per Page').''.$/; return $scrout; } @@ -882,7 +954,7 @@ Inputs: Hash of values to save, filename Store variables away to the %persistent_db. Values will be escaped. Values that are array pointers will have their -elements escaped and concatenated in a comma seperated string. +elements escaped and concatenated in a comma separated string. =cut @@ -914,7 +986,7 @@ Inputs: filename of persistent database. Store most form variables away to the %persistent_db. Values will be escaped. Values that are array pointers will have their -elements escaped and concatenated in a comma seperated string. +elements escaped and concatenated in a comma separated string. =cut @@ -990,7 +1062,7 @@ sub parse_advanced_search { $fillflag++; } } - unless ($fillflag) { + if (! $fillflag) { &output_blank_field_error($r,$closebutton, 'phase=disp_adv',$hidden_fields); return ; @@ -1646,12 +1718,13 @@ Returns: the identifier of the table on sub set_up_table_structure { my ($datatypes,$fullindicies) = &LONCAPA::lonmetadata::describe_metadata_storage(); - unshift(@$datatypes,{name => 'id', + # Copy the table description before modifying it... + @Datatypes = @{$datatypes}; + unshift(@Datatypes,{name => 'id', type => 'MEDIUMINT', restrictions => 'UNSIGNED NOT NULL', primary_key => 'yes', auto_inc => 'yes' }); - @Datatypes = @{$datatypes}; @Fullindicies = @{$fullindicies}; return; } @@ -1849,11 +1922,14 @@ END END $r->rflush(); my $time_remaining = $max_time - (time - $starttime) ; + $time_remaining = 0 if ($time_remaining <0); my $last_time = $time_remaining; &update_seconds($r,$time_remaining); &update_status($r,'contacting '.$Servers_to_contact[0]); while (($time_remaining > 0) && ((@Servers_to_contact) || keys(%Server_status))) { + $time_remaining = $max_time - (time - $starttime) ; + &update_seconds($r,$time_remaining); # Send out a search request if it needs to be done. if (@Servers_to_contact) { # Contact one server @@ -1879,6 +1955,12 @@ END # have results from yet, looking for results. while (my ($server,$status) = each(%Server_status)) { last if ($connection->aborted()); + $time_remaining = $max_time - (time - $starttime) ; + $time_remaining = 0 if ($time_remaining < 0); + if ($last_time - $time_remaining > 0) { + $last_time = $time_remaining; + &update_seconds($r,$time_remaining); + } if ($status eq 'con_lost') { delete ($Server_status{$server}); next; @@ -1921,6 +2003,7 @@ END # $r->print(&Apache::lonmysql::get_debug()); $hitcountsum ++; $time_remaining = $max_time - (time - $starttime) ; + $time_remaining = 0 if ($time_remaining < 0); if ($last_time - $time_remaining > 0) { &update_seconds($r,$time_remaining); $last_time = $time_remaining; @@ -2116,8 +2199,12 @@ sub display_results { } my %Fields = %{&parse_row(@$row)}; my $output="

\n"; + if (! defined($Fields{'title'}) || $Fields{'title'} eq '') { + $Fields{'title'} = 'Untitled'; + } my $prefix=&catalogmode_output($Fields{'title'},$Fields{'url'}, $Fields{'id'},$checkbox_num++); + # Render the result into html $output.= &$viewfunction($prefix,%Fields); # Print them out as they come in. @@ -2236,11 +2323,10 @@ The 'title' field is set to "Untitled" i sub parse_raw_result { my ($result,$hostname) = @_; # conclude from self to others regarding fields - my %Fields=&Apache::lonmeta::metadata_col_to_hash( - map { - &Apache::lonnet::unescape($_); - } (split(/\,/,$result)) - ); + my %Fields=&LONCAPA::lonmetadata::metadata_col_to_hash + (map { + &Apache::lonnet::unescape($_); + } (split(/\,/,$result)) ); return %Fields; } @@ -2634,34 +2720,38 @@ END ###################################################################### sub xml_sgml_view { my ($prefix,%values) = @_; + my $xml = < +$values{'url'} +$values{'title'} +$values{'author'} +$values{'subject'} +$values{'keywords'} +$values{'notes'} + +$values{'mime'} +$values{'mimetag'} + + +$values{'language'} +$values{'languagetag'} + +$values{'creationdate'} +$values{'lastrevisiondate'} +$values{'owner'} + +$values{'copyright'} +$values{'copyrighttag'} + +$values{'hostname'} +$values{'shortabstract'} + +END + $xml = &HTML::Entities::encode($xml,'<>&'); my $result=< -<LonCapaResource> -<url>$values{'url'}</url> -<title>$values{'title'}</title> -<author>$values{'author'}</author> -<subject>$values{'subject'}</subject> -<keywords>$values{'keywords'}</keywords> -<notes>$values{'notes'}</notes> -<mimeInfo> -<mime>$values{'mime'}</mime> -<mimetag>$values{'mimetag'}</mimetag> -</mimeInfo> -<languageInfo> -<language>$values{'language'}</language> -<languagetag>$values{'languagetag'}</languagetag> -</languageInfo> -<creationdate>$values{'creationdate'}</creationdate> -<lastrevisiondate>$values{'lastrevisiondate'}</lastrevisiondate> -<owner>$values{'owner'}</owner> -<copyrightInfo> -<copyright>$values{'copyright'}</copyright> -<copyrighttag>$values{'copyrighttag'}</copyrighttag> -</copyrightInfo> -<repositoryLocation>$values{'hostname'}</repositoryLocation> -<shortabstract>$values{'shortabstract'}</shortabstract> -</LonCapaResource> +$xml $values{'extrashow'}