--- loncom/interface/lonsearchcat.pm 2004/04/19 13:51:36 1.207 +++ 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.207 2004/04/19 13:51:36 matthew Exp $ +# $Id: lonsearchcat.pm,v 1.212 2004/04/19 21:46:50 matthew Exp $ # # Copyright Michigan State University Board of Trustees # @@ -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 @@ -487,14 +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'); + &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 $CatalogSearch=&mt('Catalog Search'); my $Statement=&searchhelp(); $scrout.=(<$CatalogSearch
$hidden_fields @@ -506,7 +548,7 @@ $Statement. ENDDOCUMENT $scrout.=' '. - &Apache::lonhtmlcommon::textbox('basicexp', + &Apache::lonhtmlcommon::textbox('basicexp', $ENV{'form.basicexp'},40). ' '; my $relatedcheckbox = @@ -609,56 +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=&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.=''; - $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.=''.$/; } - $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(&mt('MIME Type Category')).''. + foreach my $field ('lowestgradelevel','highestgradelevel') { + $scrout.='
'.&titlefield($fields{$field}).''. + &Apache::lonmeta::prettyinput($field, + $ENV{'form.'.$field}, + $field, + 'advsearch', + 0). + '
'. + &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) { + 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; } ###################################################################### @@ -732,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; } @@ -987,7 +1062,7 @@ sub parse_advanced_search { $fillflag++; } } - unless ($fillflag) { + if (! $fillflag) { &output_blank_field_error($r,$closebutton, 'phase=disp_adv',$hidden_fields); return ; @@ -1643,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; } @@ -1846,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 @@ -1876,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; @@ -1918,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; @@ -2113,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. @@ -2630,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'}