--- loncom/interface/lonsearchcat.pm 2002/08/01 14:11:57 1.150 +++ loncom/interface/lonsearchcat.pm 2002/11/22 18:36:07 1.161 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Search Catalog # -# $Id: lonsearchcat.pm,v 1.150 2002/08/01 14:11:57 matthew Exp $ +# $Id: lonsearchcat.pm,v 1.161 2002/11/22 18:36:07 matthew Exp $ # # Copyright Michigan State University Board of Trustees # @@ -115,6 +115,11 @@ that produces it. Adding a new view typ adding a line to the definition of this hash and making sure the function takes the proper parameters. +=item $bodytag + +LON-CAPA standard body tag, gotten from &Apache::lonnet::bodytag. +No title, no table, just a tag. + =back =cut @@ -136,6 +141,8 @@ my %Views = ("Detailed Citation View" => "Compact View" => \&compact_view); my %persistent_db; my $hidden_fields; +my $bodytag; + ###################################################################### ###################################################################### @@ -164,6 +171,10 @@ string that holds portions of the screen sub handler { my $r = shift; # + + my $loaderror=&Apache::lonnet::overloaderror($r); + if ($loaderror) { return $loaderror; } + my $closebutton; # button that closes the search window # This button is different for the RAT compared to # normal invocation. @@ -171,12 +182,17 @@ sub handler { $r->content_type('text/html'); $r->send_http_header; return OK if $r->header_only; + ## + ## Prevent caching of the search interface window. Hopefully this means + ## we will get the launch=1 passed in a little more. + &Apache::loncommon::no_cache($r); ## ## Pick up form fields passed in the links. ## &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, ['catalogmode','launch','acts','mode','form','element','pause', - 'phase','persistent_db_id','table','start','show']); + 'phase','persistent_db_id','table','start','show', + 'cleargroupsort']); ## ## The following is a trick - we wait a few seconds if asked to so ## the daemon running the search can get ahead of the daemon @@ -201,19 +217,20 @@ sub handler { ($ENV{'form.launch'} eq '1')) { $ENV{'form.persistent_db_id'} = time; } + $bodytag=&Apache::loncommon::bodytag(undef,undef,undef,1); my $persistent_db_file = "/home/httpd/perl/tmp/". &Apache::lonnet::escape($domain). '_'.&Apache::lonnet::escape($ENV{'user.name'}). '_'.$ENV{'form.persistent_db_id'}.'_persistent_search.db'; ## - if (! &get_persistent_form_data($r,$persistent_db_file)) { + if (! &get_persistent_form_data($persistent_db_file)) { if ($ENV{'form.phase'} =~ /(run_search|results)/) { &Apache::lonnet::logthis("lonsearchcat:Unable to recover data ". "from $persistent_db_file"); $r->print(< LON-CAPA Search Error - +$bodytag We were unable to retrieve data describing your search. This is a serious error and has been logged. Please alert your LON-CAPA administrator. @@ -226,15 +243,18 @@ END ## Clear out old values from groupsearch database ## untie %groupsearch_db if (tied(%groupsearch_db)); - if ($ENV{'form.launch'} eq '1' && - ($ENV{'form.catalogmode'} eq 'groupsearch') && - ($ENV{'form.phase'} eq 'results')) { + if (($ENV{'form.cleargroupsort'} eq '1') || + (($ENV{'form.launch'} eq '1') && + ($ENV{'form.catalogmode'} eq 'groupsearch'))) { if (tie(%groupsearch_db,'GDBM_File',$diropendb,&GDBM_WRCREAT(),0640)) { &start_fresh_session(); untie %groupsearch_db; + delete($ENV{'form.cleargroupsort'}); } else { - $r->print('Unable to tie hash to db '. - 'file'); + # This is a stupid error to give to the user. + # It really tells them nothing. + $r->print(''.$bodytag. + 'Unable to tie hash to db file'); return OK; } } @@ -298,6 +318,7 @@ END } } $ENV{'form.phase'} = 'disp_basic' if (! exists($ENV{'form.phase'})); + $ENV{'form.show'} = 20 if (! exists($ENV{'form.show'})); ## ## Switch on the phase ## @@ -307,20 +328,28 @@ END &print_advanced_search_form($r,$closebutton); } elsif ($ENV{'form.phase'} eq 'results') { &display_results($r,$importbutton,$closebutton); - } elsif($ENV{'form.phase'} eq 'run_search') { + } elsif ($ENV{'form.phase'} =~ /^(sort|run_search)$/) { my ($query,$customquery,$customshow,$libraries,$pretty_string) = &get_persistent_data($persistent_db_file, ['query','customquery','customshow', 'libraries','pretty_string']); - &run_search($r,$query,$customquery,$customshow, - $libraries,$pretty_string); + if ($ENV{'form.phase'} eq 'sort') { + &print_sort_form($r,$pretty_string); + } elsif ($ENV{'form.phase'} eq 'run_search') { + &run_search($r,$query,$customquery,$customshow, + $libraries,$pretty_string); + } } 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())) { $r->print(<Search Error - +$bodytag Unable to create table in which to store search results. The search has been aborted. @@ -332,7 +361,7 @@ END if (! &make_form_data_persistent($r,$persistent_db_file)) { $r->print(<Search Error - +$bodytag Unable to properly store search information. The search has been aborted. @@ -351,8 +380,7 @@ END = &parse_advanced_search($r,$closebutton); return OK if (! defined($query)); } - &make_persistent($r, - { query => $query, + &make_persistent({ query => $query, customquery => $customquery, customshow => $customshow, libraries => $libraries, @@ -382,6 +410,7 @@ Returns a scalar which holds html for th sub print_basic_search_form{ my ($r,$closebutton) = @_; + my $bodytag=&Apache::loncommon::bodytag('Catalog Search'); my $scrout=<<"ENDDOCUMENT"; @@ -394,13 +423,10 @@ sub print_basic_search_form{ } - - -

Search Catalog

+$bodytag
$hidden_fields -

Basic Search

Enter terms or phrases separated by AND, OR, or NOT then press SEARCH below. @@ -413,7 +439,9 @@ ENDDOCUMENT ' '; my $checkbox = &simplecheckbox('related',$ENV{'form.related'}); $scrout.=<Advanced Search +Advanced Search $checkbox use related words

@@ -425,8 +453,12 @@ END $ENV{'form.viewselect'}, undef,undef,undef, sort(keys(%Views))); + $scrout.=&selectbox(undef,'show', + $ENV{'form.show'}, + undef,undef,undef, + (10,20,50,100)); $scrout.=< +per page.

@@ -462,6 +494,7 @@ END if (!defined($ENV{'form.viewselect'})) { $ENV{'form.viewselect'} ="Detailed Citation View"; } + my $bodytag=&Apache::loncommon::bodytag('Advanced Catalog Search'); my $scrout=<<"ENDHEADER"; @@ -474,10 +507,7 @@ END } - - -

Advanced Catalog Search

-
+$bodytag Enter terms or phrases separated by search operators such as AND, OR, or NOT.
@@ -492,6 +522,13 @@ ENDHEADER $ENV{'form.viewselect'}, undef,undef,undef, sort(keys(%Views))); + $scrout.=' '; + $scrout.=&selectbox(undef,'show', + $ENV{'form.show'}, + undef,undef,undef, + (10,20,50,100)); + $scrout.=' '. + 'Per Page'; $scrout.="Related
Words\n"; $scrout.=&searchphrasefield_with_related('title', 'title' , $ENV{'form.title'}); @@ -507,13 +544,13 @@ ENDHEADER $ENV{'form.abstract'}); # Hack - an empty table row. $scrout.="   \n"; - $scrout.=&searchphrasefield('file
extension','mime', - $ENV{'form.mime'}); + $scrout.=&searchphrasefield('file
extension','extension', + $ENV{'form.extension'}); $scrout.="   \n"; $scrout.=&searchphrasefield('publisher
owner','owner', $ENV{'form.owner'}); $scrout.="\n"; - $ENV{'form.category'}='any' unless length($ENV{'form.category'}); + $ENV{'form.category'}='any' if (! defined($ENV{'form.category'})); $scrout.=&selectbox('File Category','category', $ENV{'form.category'}, 'any','Any category', @@ -600,25 +637,25 @@ LASTREVISIONDATEEND (&Apache::loncommon::copyrightids), ); # ------------------------------------------- Compute customized metadata field - $scrout.=< -LIMIT BY SPECIAL METADATA FIELDS: - -For resource-specific metadata, enter in an expression in the form of -key=value separated by operators such as AND, OR or NOT.
-Example: grandmother=75 OR grandfather=85 -
-CUSTOMMETADATA - $scrout.=&simpletextfield('custommetadata',$ENV{'form.custommetadata'}); - $scrout.=< -SHOW SPECIAL METADATA FIELDS: - -Enter in a space-separated list of special metadata fields to show -in a fielded listing for each record result. -
-CUSTOMSHOW - $scrout.=&simpletextfield('customshow',$ENV{'form.customshow'}); +# $scrout.=< +#LIMIT BY SPECIAL METADATA FIELDS: +# +#For resource-specific metadata, enter in an expression in the form of +#key=value separated by operators such as AND, OR or NOT.
+#Example: grandmother=75 OR grandfather=85 +#
+#CUSTOMMETADATA +# $scrout.=&simpletextfield('custommetadata',$ENV{'form.custommetadata'}); +# $scrout.=< +#SHOW SPECIAL METADATA FIELDS: +# +#Enter in a space-separated list of special metadata fields to show +#in a fielded listing for each record result. +#
+#CUSTOMSHOW +# $scrout.=&simpletextfield('customshow',$ENV{'form.customshow'}); $scrout.=< @@ -651,36 +688,26 @@ to them. ###################################################################### ###################################################################### sub get_persistent_form_data { - my $r = shift; my $filename = shift; return 0 if (! -e $filename); return undef if (! tie(%persistent_db,'GDBM_File',$filename, &GDBM_READER(),0640)); # # These make sure we do not get array references printed out as 'values'. - my %arrays_allowed = ('form.category'=>1,'form.domains'=>1); + my %arrays_allowed = ('form.domains'=>1); # # Loop through the keys, looking for 'form.' foreach my $name (keys(%persistent_db)) { next if ($name !~ /^form./); + next if (exists($ENV{$name})); my @values = map { &Apache::lonnet::unescape($_); } split(',',$persistent_db{$name}); next if (@values <1); - if (exists($ENV{$name})) { - if (ref($ENV{$name}) eq 'ARRAY') { - # If it is an array, tack @values on the end of it. - $ENV{$name} = [@$ENV{$name},@values]; - } elsif (! ref($ENV{$name}) && $arrays_allowed{$name}) { - # if arrays are allowed, turn it into one and add @values - $ENV{$name} = [$ENV{$name},@values]; - } # otherwise, assume the value in $ENV{$name} is better than ours. + if ($arrays_allowed{$name}) { + $ENV{$name} = [@values]; } else { - if ($arrays_allowed{$name}) { - $ENV{$name} = [@values]; - } else { - $ENV{$name} = $values[0] if ($values[0]); - } + $ENV{$name} = $values[0] if ($values[0]); } } untie (%persistent_db); @@ -721,7 +748,7 @@ sub get_persistent_data { my @values = map { &Apache::lonnet::unescape($_); } split(',',$persistent_db{$name}); - if (@values == 1) { + if (@values <= 1) { push @Values,$values[0]; } else { push @Values,\@values; @@ -749,14 +776,11 @@ elements escaped and concatenated in a c ###################################################################### ###################################################################### sub make_persistent { - my $r = shift; my %save = %{shift()}; my $filename = shift; return undef if (! tie(%persistent_db,'GDBM_File', $filename,&GDBM_WRCREAT(),0640)); foreach my $name (keys(%save)) { - next if (! exists($save{$name})); - next if (! defined($save{$name}) || $save{$name} eq ''); my @values = (ref($save{$name}) ? @{$save{$name}} : ($save{$name})); # We handle array references, but not recursively. my $store = join(',', map { &Apache::lonnet::escape($_); } @values ); @@ -791,7 +815,7 @@ sub make_form_data_persistent { next if (!/^form/ || /submit/); $save{$_} = $ENV{$_}; } - return &make_persistent($r,\%save,$filename); + return &make_persistent(\%save,$filename); } ###################################################################### @@ -1112,7 +1136,7 @@ sub parse_advanced_search { 'lastrevisiondatestart_month','lastrevisiondatestart_day', 'lastrevisiondatestart_year','lastrevisiondateend_month', 'lastrevisiondateend_day','lastrevisiondateend_year', - 'notes','abstract','mime','language','owner', + 'notes','abstract','extension','language','owner', 'custommetadata','customshow','category') { $ENV{"form.$field"}=~s/[^\w\/\s\(\)\=\-\"\']//g; } @@ -1123,21 +1147,19 @@ sub parse_advanced_search { $ENV{"form.$_"}=~s/[^\w\/\s\(\)\=\-\"\']//g; } # Preprocess the category form element. - if ($ENV{'form.category'} ne 'any') { - my @extensions = &Apache::loncommon::filecategorytypes - ($ENV{'form.category'}); - $ENV{'form.mime'} = join ' OR ',@extensions; - } + $ENV{'form.category'} = 'any' if (! defined($ENV{'form.category'}) || + ref($ENV{'form.category'})); + # # Check to see if enough information was filled in for my $field ('title','author','subject','keywords','url','version', - 'notes','abstract','mime','language','owner', - 'custommetadata') { + 'notes','abstract','category','extension','language', + 'owner','custommetadata') { if (&filled($ENV{"form.$field"})) { $fillflag++; } } unless ($fillflag) { - &output_blank_field_error($r,$closebutton); + &output_blank_field_error($r,$closebutton,'phase=disp_adv'); return ; } # Turn the form input into a SQL-based query @@ -1146,7 +1168,7 @@ sub parse_advanced_search { my $font = ''; # Evaluate logical expression AND/OR/NOT phrase fields. foreach my $field ('title','author','subject','notes','abstract','url', - 'keywords','version','owner','mime') { + 'keywords','version','owner') { if ($ENV{'form.'.$field}) { my $searchphrase = $ENV{'form.'.$field}; $pretty_search_string .= $font."$field contains ". @@ -1165,10 +1187,30 @@ sub parse_advanced_search { push @queries,&build_SQL_query($field,$searchphrase); } } - # I dislike the hack below. - if ($ENV{'form.category'}) { - $ENV{'form.mime'}=''; + # + # Make the 'mime' from 'form.category' and 'form.extension' + # + my $searchphrase; + if (exists($ENV{'form.category'}) && + $ENV{'form.category'} !~ /^\s*$/ && + $ENV{'form.category'} ne 'any') { + my @extensions = &Apache::loncommon::filecategorytypes + ($ENV{'form.category'}); + if (scalar(@extensions) > 0) { + $searchphrase = join(' OR ',@extensions); + } + } + if (exists($ENV{'form.extension'}) && $ENV{'form.extension'} !~ /^\s*$/) { + $searchphrase .= ' OR ' if (defined($searchphrase)); + my @extensions = split(/,/,$ENV{'form.extension'}); + $searchphrase .= join(' OR ',@extensions); + } + if (defined($searchphrase)) { + push @queries,&build_SQL_query('mime',$searchphrase); + $pretty_search_string .=$font.'mime contains '. + $searchphrase.'
'; } + ##### # Evaluate option lists if ($ENV{'form.language'} and $ENV{'form.language'} ne 'any') { push @queries,"(language like \"$ENV{'form.language'}\")"; @@ -1209,21 +1251,21 @@ sub parse_advanced_search { } # Process form information for custom metadata querying my $customquery=undef; - if ($ENV{'form.custommetadata'}) { - $pretty_search_string .=$font."Custom Metadata Search: ". - $ENV{'form.custommetadata'}."
\n"; - $customquery=&build_custommetadata_query('custommetadata', - $ENV{'form.custommetadata'}); - } +# if ($ENV{'form.custommetadata'}) { +# $pretty_search_string .=$font."Custom Metadata Search: ". +# $ENV{'form.custommetadata'}."
\n"; +# $customquery=&build_custommetadata_query('custommetadata', +# $ENV{'form.custommetadata'}); +# } my $customshow=undef; - if ($ENV{'form.customshow'}) { - $pretty_search_string .=$font."Custom Metadata Display: ". - $ENV{'form.customshow'}."
\n"; - $customshow=$ENV{'form.customshow'}; - $customshow=~s/[^\w\s]//g; - my @fields=split(/\s+/,$customshow); - $customshow=join(" ",@fields); - } +# if ($ENV{'form.customshow'}) { +# $pretty_search_string .=$font."Custom Metadata Display: ". +# $ENV{'form.customshow'}."
\n"; +# $customshow=$ENV{'form.customshow'}; +# $customshow=~s/[^\w\s]//g; +# my @fields=split(/\s+/,$customshow); +# $customshow=join(" ",@fields); +# } ## --------------------------------------------------------------- ## Deal with restrictions to given domains ## @@ -1238,15 +1280,15 @@ sub parse_advanced_search { $domain_hash{$_}++; } if ($domain_hash{'any'}) { - $pretty_domains_string = "Searching all domains."; + $pretty_domains_string = "In all LON-CAPA domains."; } else { if (@allowed_domains > 1) { - $pretty_domains_string = "Searching domains:"; + $pretty_domains_string = "In LON-CAPA domains:"; } else { - $pretty_domains_string = "Searching domain "; + $pretty_domains_string = "In LON-CAPA domain "; } foreach (sort @allowed_domains) { - $pretty_domains_string .= "$_ "; + $pretty_domains_string .= "".$_." "; } foreach (keys(%Apache::lonnet::libserv)) { if (exists($domain_hash{$Apache::lonnet::hostdom{$_}})) { @@ -1294,7 +1336,7 @@ sub parse_basic_search { # Check to see if enough is filled in unless (&filled($ENV{'form.basicexp'})) { - &output_blank_field_error($r,$closebutton); + &output_blank_field_error($r,$closebutton,'phase=disp_basic'); return OK; } my $pretty_search_string = ''.$ENV{'form.basicexp'}.''; @@ -1530,7 +1572,6 @@ sub build_date_queries { ###################################################################### ###################################################################### - sub copyright_check { my $Metadata = shift; # Check copyright tags and skip results the user cannot use @@ -1550,6 +1591,152 @@ sub copyright_check { return 1; } + +###################################################################### +###################################################################### + +=pod + +=item &ensure_db_and_table + +Ensure we can get lonmysql to connect to the database and the table we +need exists. + +Inputs: $r, table id + +Returns: undef on error, 1 if the table exists. + +=cut + +###################################################################### +###################################################################### +sub ensure_db_and_table { + my ($r,$table) = @_; + ## + ## Sanity check the table id. + ## + if (! defined($table) || $table eq '' || $table =~ /\D/ ) { + $r->print("Unable to retrieve search results. ". + "Unable to determine the table results were stored in. ". + ""); + return undef; + } + ## + ## Make sure we can connect and the table exists. + ## + my $connection_result = &Apache::lonmysql::connect_to_db(); + if (!defined($connection_result)) { + $r->print("Unable to connect to the MySQL database where your results". + " are stored. "); + &Apache::lonnet::logthis("lonsearchcat: unable to get lonmysql to". + " connect to database."); + &Apache::lonnet::logthis(&Apache::lonmysql::get_error()); + return undef; + } + my $table_check = &Apache::lonmysql::check_table($table); + if (! defined($table_check)) { + $r->print("A MySQL error has occurred."); + &Apache::lonnet::logthis("lonmysql was unable to determine the status". + " of table ".$table); + return undef; + } elsif (! $table_check) { + $r->print("The table of results could not be found."); + &Apache::lonnet::logthis("The user requested a table, ".$table. + ", that could not be found."); + return undef; + } + return 1; +} + +###################################################################### +###################################################################### + +=pod + +=item &print_sort_form + +=cut + +###################################################################### +###################################################################### +sub print_sort_form { + my ($r,$pretty_query_string) = @_; + ## + my %SortableFields = + (id => 'Default', + title => 'Title', + author => 'Author', + subject => 'Subject', + url => 'URL', + version => 'Version Number', + mime => 'Mime type', + lang => 'Language', + owner => 'Owner/Publisher', + copyright => 'Copyright', + hostname => 'Host', + creationdate => 'Creation Date', + lastrevisiondate => 'Revision Date', + ); + ## + my $table = $ENV{'form.table'}; + return if (! &ensure_db_and_table($r,$table)); + ## + ## Get the number of results + ## + my $total_results = &Apache::lonmysql::number_of_rows($table); + if (! defined($total_results)) { + $r->print("A MySQL error has occurred."); + &Apache::lonnet::logthis("lonmysql was unable to determine the number". + " of rows in table ".$table); + &Apache::lonnet::logthis(&Apache::lonmysql::get_error()); + return; + } + my $result; + $result.=< + + +Results + +$bodytag +
+ +END + +#

Sort Results

+#Sort by: }; + return $result; +} + +###################################################################### +###################################################################### + +=pod + =item &run_search =cut @@ -1703,19 +1918,36 @@ sub run_search { # Timing variables # my $starttime = time; - my $max_time = 120; # seconds for the search to complete + my $max_time = 30; # seconds for the search to complete # # Print run_search header # - $r->print("Search Status"); - $r->print("Search: ".$pretty_string."\n"); + $r->print(< +Search Status +$bodytag + + +END + # Check to see if $pretty_string has more than one carriage return. + # Assume \n s are following
s and truncate the value. + # (there is probably a better way)... + my @Lines = split /
/,$pretty_string; + if (@Lines > 2) { + $pretty_string = join '
',(@Lines[0..2],'....
'); + } + $r->print("Search: ".$pretty_string); $r->rflush(); # # Determine the servers we need to contact. # my @Servers_to_contact; if (defined($serverlist)) { - @Servers_to_contact = @$serverlist; + if (ref($serverlist) eq 'ARRAY') { + @Servers_to_contact = @$serverlist; + } else { + @Servers_to_contact = ($serverlist); + } } else { @Servers_to_contact = sort(keys(%Apache::lonnet::libserv)); } @@ -1746,15 +1978,15 @@ sub run_search { my $hitcountsum; my $server; my $status; + my $revise = &revise_button(); $r->print(< - - + +
StatusTotal MatchesTime Remaining
StatusTotal MatchesTime Remaining
$revise
@@ -1763,7 +1995,7 @@ END my $time_remaining = $max_time - (time - $starttime) ; my $last_time = $time_remaining; &update_seconds($r,$time_remaining); - while (($time_remaining > 0) && + while (($time_remaining > 0) && ((@Servers_to_contact) || keys(%Server_status))) { # Send out a search request if it needs to be done. if (@Servers_to_contact) { @@ -1781,7 +2013,13 @@ END # left to contact. sleep(1); } - &update_status($r,'waiting on '.(join(' ',keys(%Server_status)))); + # + if (scalar (keys(%Server_status))) { + &update_status($r,'waiting on '.(join(' ',keys(%Server_status)))); + } + # + # Loop through the servers we have contacted but do not + # have results from yet, looking for results. while (my ($server,$status) = each(%Server_status)) { last if ($connection->aborted()); if ($status eq 'con_lost') { @@ -1844,6 +2082,7 @@ END } last if ($connection->aborted()); # Finished looping through the servers + $starttime = time if (@Servers_to_contact); $time_remaining = $max_time - (time - $starttime) ; if ($last_time - $time_remaining > 0) { $last_time = $time_remaining; @@ -1851,18 +2090,18 @@ END } } &update_status($r,'Search Complete'.$server); + &update_seconds($r,0); &Apache::lonmysql::disconnect_from_db(); - # Let the user know - # # We have run out of time or run out of servers to talk to and # results to get. - $r->print("Search Completed.  "); - if ($hitcountsum) { - $r->print($hitcountsum." matches were found."); - } else { - $r->print("There were no successful matches to your query."); - } $r->print(""); + if ($ENV{'form.catalogmode'} ne 'groupsearch') { + $r->print(""); + } return; } @@ -1883,7 +2122,7 @@ sub prev_next_buttons { ## ## Prev my $prev_min = $current_min - $show; - $prev_min = 0 if $prev_min < 0; + $prev_min = 1 if $prev_min < 1; if ($prev_min < $current_min) { $links .= qq{ prev @@ -1935,6 +2174,10 @@ sub display_results { return; } ## + ## $checkbox_num is a count of the number of checkboxes output on the + ## page this is used only during catalogmode=groupsearch. + my $checkbox_num = 0; + ## ## Get the catalog controls setup ## my $action = "/adm/searchcat?phase=results"; @@ -1953,22 +2196,7 @@ sub display_results { ## Prepare the table for querying ## my $table = $ENV{'form.table'}; - my $connection_result = &Apache::lonmysql::connect_to_db(); - if (!defined($connection_result)) { - $r->print(&Apache::lonmysql::get_error()); - } - my $table_check = &Apache::lonmysql::check_table($table); - if (! defined($table_check)) { - $r->print("A MySQL error has occurred."); - &Apache::lonnet::logthis("lonmysql was unable to determine the status". - " of table ".$table); - return; - } elsif (! $table_check) { - $r->print("The table of results could not be found."); - &Apache::lonnet::logthis("The user requested a table, ".$table. - ", that could not be found."); - return; - } + return if (! &ensure_db_and_table($r,$table)); ## ## Get the number of results ## @@ -1978,21 +2206,19 @@ sub display_results { &Apache::lonnet::logthis("lonmysql was unable to determine the number". " of rows in table ".$table); &Apache::lonnet::logthis(&Apache::lonmysql::get_error()); - &Apache::lonnet::logthis(&Apache::lonmysql::get_debug()); return; } ## ## Determine how many results we need to get ## - $ENV{'form.show'} = 20; - $ENV{'form.start'} = 0 if (! exists($ENV{'form.start'})); - $ENV{'form.show'} = 'all' if (! exists($ENV{'form.show'})); + $ENV{'form.start'} = 1 if (! exists($ENV{'form.start'})); + $ENV{'form.show'} = 'all' if (! exists($ENV{'form.show'})); my $min = $ENV{'form.start'}; my $max; if ($ENV{'form.show'} eq 'all') { $max = $total_results ; } else { - $max = $min + $ENV{'form.show'}; + $max = $min + $ENV{'form.show'} - 1; $max = $total_results if ($max > $total_results); } ## @@ -2018,7 +2244,7 @@ sub display_results { ## Get results from MySQL table ## my @Results = &Apache::lonmysql::get_rows($table, - 'id>'.$min.' AND id<='.$max); + 'id>='.$min.' AND id<='.$max); ## ## Loop through the results and output them. ## @@ -2030,7 +2256,8 @@ sub display_results { } my %Fields = %{&parse_row(@$row)}; my $output="

\n"; - my $prefix=&catalogmode_output($Fields{'title'},$Fields{'url'}); + 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. @@ -2061,22 +2288,18 @@ sub display_results { =pod -=item &catalogmode_output($title,$url) +=item &catalogmode_output($title,$url,$fnum,$checkbox_num) Returns html needed for the various catalog modes. Gets inputs from -$ENV{'form.catalogmode'}. Stores data in %groupsearch_db and $fnum -(local variable). +$ENV{'form.catalogmode'}. Stores data in %groupsearch_db. =cut ###################################################################### ###################################################################### -{ -my $fnum = 0; - sub catalogmode_output { my $output = ''; - my ($title,$url) = @_; + my ($title,$url,$fnum,$checkbox_num) = @_; if ($ENV{'form.catalogmode'} eq 'interactive') { $title=~ s/\'/\\\'/g; if ($ENV{'form.catalogmode'} eq 'interactive') { @@ -2092,15 +2315,12 @@ END $output.=< +onClick="javascript:queue($checkbox_num,$fnum)" /> END - $fnum++; } return $output; } - -} ###################################################################### ###################################################################### @@ -2312,13 +2532,13 @@ sub search_results_header { parent.close(); } function changeTitle(val) { - if (opener.inf.document.forms.resinfo.elements.t) { - opener.inf.document.forms.resinfo.elements.t.value=val; + if (parent.opener.inf.document.forms.resinfo.elements.t) { + parent.opener.inf.document.forms.resinfo.elements.t.value=val; } } function changeURL(val) { - if (opener.inf.document.forms.resinfo.elements.u) { - opener.inf.document.forms.resinfo.elements.u.value=val; + if (parent.opener.inf.document.forms.resinfo.elements.u) { + parent.opener.inf.document.forms.resinfo.elements.u.value=val; } } @@ -2348,8 +2568,8 @@ SCRIPT } $result.=< LON-CAPA Digital Library Search Results @@ -2625,12 +2847,21 @@ sub filled { =item &output_blank_field_error() +Output a complete page that indicates the user has not filled in enough +information to do a search. + +Inputs: $r (Apache request handle), $closebutton, $parms. + +Returns: nothing + +$parms is extra information to include in the 'Revise search request' link. + =cut ###################################################################### ###################################################################### sub output_blank_field_error { - my ($r,$closebutton)=@_; + my ($r,$closebutton,$parms)=@_; # make query information persistent to allow for subsequent revision $r->print(< @@ -2639,21 +2870,20 @@ sub output_blank_field_error { BEGINNING $r->print(< - +$bodytag

Search Catalog

$hidden_fields -Revise search request  $closebutton
-

Helpful Message

+

Unactionable search query.

-Incorrect search query due to blank entry fields. -You need to fill in the relevant -fields on the search page in order for a query to be -processed. +You did not fill in enough information for the search to be started. +You need to fill in relevant fields on the search page in order +for a query to be processed.

@@ -2687,7 +2917,7 @@ sub output_date_error { The LearningOnline Network with CAPA - +$bodytag

Search Catalog

@@ -2696,7 +2926,7 @@ $hidden_fields onClick='this.form.submit();' /> $closebutton
-

Helpful Message

+

Error

$message