--- loncom/interface/lonsearchcat.pm 2002/06/27 14:46:00 1.132 +++ loncom/interface/lonsearchcat.pm 2002/07/03 19:11:09 1.134 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Search Catalog # -# $Id: lonsearchcat.pm,v 1.132 2002/06/27 14:46:00 matthew Exp $ +# $Id: lonsearchcat.pm,v 1.134 2002/07/03 19:11:09 matthew Exp $ # # Copyright Michigan State University Board of Trustees # @@ -107,7 +107,7 @@ button that closes the search window =item $importbutton -button to take the selecte results and go to group sorting +button to take the select results and go to group sorting =item %hash @@ -212,25 +212,36 @@ END onClick='javascript:select_group()'> END } - $hidden .= < - - - -END + $hidden .= &make_persistent({ "form.mode" => $ENV{'form.mode'}, + "form.form" => $ENV{'form.form'}, + "form.element" => $ENV{'form.element'}, + "form.date" => 2 }); ## ## What are we doing? ## - if ($ENV{'form.basicsubmit'} eq 'SEARCH') { - # Perform basic search and give results - return &basicsearch($r,$hidden); - } elsif ($ENV{'form.advancedsubmit'} eq 'SEARCH') { - # Perform advanced search and give results - return &advancedsearch($r,$hidden); + my $searchtype; + $searchtype = 'Basic' if ($ENV{'form.basicsubmit'} eq 'SEARCH'); + $searchtype = 'Advanced' if ($ENV{'form.advancedsubmit'} eq 'SEARCH'); + if ($searchtype) { + my ($query,$customquery,$customshow,$libraries) = + (undef,undef,undef,undef); + if ($searchtype eq 'Basic') { + $query = &parse_basic_search($r); + } elsif ($ENV{'form.advancedsubmit'} eq 'SEARCH') { + ($query,$customquery,$customshow,$libraries) + = &parse_advanced_search($r); + return OK if (! defined($query)); + } + # Send query statements over the network to be processed by + # either the SQL database or a recursive scheme of 'grep'-like + # actions (for custom metadata). + $r->rflush(); + my $reply=&Apache::lonnet::metadata_query($query,$customquery, + $customshow,$libraries); + &output_results($searchtype,$r,$reply,$hidden); } elsif ($ENV{'form.reqinterface'} eq 'advanced') { # Output the advanced interface $r->print(&advanced_search_form($closebutton,$hidden)); - return OK; } else { # Output normal search interface $r->print(&basic_search_form($closebutton,$hidden)); @@ -395,10 +406,17 @@ ENDHEADER undef, (&Apache::loncommon::filecategories())); $ENV{'form.language'}='any' unless length($ENV{'form.language'}); - # + #---------------------------------------------------------------- # Allow restriction to multiple domains. # I make the crazy assumption that there will never be a domain 'any'. # + $ENV{'form.domains'} = 'any' if (! exists($ENV{'form.domains'})); + my @allowed_domains = (ref($ENV{'form.domains'}) ? @{$ENV{'form.domains'}} + : ($ENV{'form.domains'}) ); + my %domain_hash = (); + foreach (@allowed_domains) { + $domain_hash{$_}++; + } my @domains =&Apache::loncommon::get_domains(); # adjust the size of the select box my $size = 4; @@ -407,16 +425,19 @@ ENDHEADER if ((scalar @domains) == 1) { $scrout .=''."\n"; } else { - $scrout.=''. + $scrout.="\n".''. 'DOMAINS
'. '\n"; } - # + #---------------------------------------------------------------- # # $scrout.=&selectbox('Limit by language','language', @@ -517,16 +538,19 @@ to be somewhat persistent. ###################################################################### sub make_persistent { + my %save = %{shift()}; my $persistent=''; - foreach (keys %ENV) { + foreach (keys %save) { if (/^form\./ && !/submit/) { my $name=$_; - my $key=$name; - $ENV{$key}=~s/\'//g; # do not mess with html field syntax + my @values = (ref($save{$name}) ? @{$save{$name}} : ($save{$name})); $name=~s/^form\.//; - $persistent.=< + foreach (@values) { + s/\"/\'/g; # do not mess with html field syntax + $persistent.=< END + } } } return $persistent; @@ -710,16 +734,28 @@ sub selectbox { =pod -=item &advancedsearch() +=item &parse_advanced_search() + +Parse advanced search form and return the following: + +=over 4 -Parse advanced search results. +=item $query Scalar containing an SQL query. + +=item $customquery Scalar containing a custom query. + +=item $customshow Scalar containing commands to show custom metadata. + +=item $libraries_to_query Reference to array of domains to search. + +=back =cut ###################################################################### ###################################################################### -sub advancedsearch { - my ($r,$hidden)=@_; +sub parse_advanced_search { + my ($r)=@_; my $fillflag=0; # Clean up fields for safety for my $field ('title','author','subject','keywords','url','version', @@ -755,7 +791,7 @@ sub advancedsearch { } unless ($fillflag) { &output_blank_field_error($r); - return OK; + return ; } # Turn the form input into a SQL-based query my $query=''; @@ -792,25 +828,25 @@ sub advancedsearch { # Test to see if date windows are legitimate if ($datequery=~/^Incorrect/) { &output_date_error($r,$datequery); - return OK; + return ; } elsif ($datequery) { push @queries,$datequery; } # Process form information for custom metadata querying - my $customquery=''; + my $customquery=undef; if ($ENV{'form.custommetadata'}) { $customquery=&build_custommetadata_query('custommetadata', $ENV{'form.custommetadata'}); } - my $customshow=''; + my $customshow=undef; if ($ENV{'form.customshow'}) { $customshow=$ENV{'form.customshow'}; $customshow=~s/[^\w\s]//g; my @fields=split(/\s+/,$customshow); $customshow=join(" ",@fields); } - ## + ## --------------------------------------------------------------- ## Deal with restrictions to given domains ## my $libraries_to_query = undef; @@ -831,40 +867,14 @@ sub advancedsearch { push @$libraries_to_query,$_; } } - if (defined($libraries_to_query)) { - &Apache::lonnet::logthis("libraries: @$libraries_to_query"); - } else { - &Apache::lonnet::logthis("libraries: undef"); - } # - # Send query statements over the network to be processed by either the SQL - # database or a recursive scheme of 'grep'-like actions (for custom - # metadata). if (@queries) { $query=join(" AND ",@queries); $query="select * from metadata where $query"; - my $reply; # reply hash reference - unless ($customquery or $customshow) { - $reply=&Apache::lonnet::metadata_query($query,undef,undef, - $libraries_to_query); - } - else { - $reply=&Apache::lonnet::metadata_query($query, - $customquery,$customshow, - $libraries_to_query); - } - &output_results('Advanced',$r,$customquery,$reply,$hidden); - return OK; } elsif ($customquery) { - my $reply; # reply hash reference - $reply=&Apache::lonnet::metadata_query('', - $customquery,$customshow, - $libraries_to_query); - &output_results('Advanced',$r,$customquery,$reply,$hidden); - return OK; + $query = ''; } - # should not get to this point - return 'Error. Should not have gone to this point.'; + return ($query,$customquery,$customshow,$libraries_to_query); } ###################################################################### @@ -872,16 +882,16 @@ sub advancedsearch { =pod -=item &basicsearch() +=item &parse_basic_search() -Parse basic search form. +Parse the basic search form and return a scalar containing an sql query. =cut ###################################################################### ###################################################################### -sub basicsearch { - my ($r,$hidden)=@_; +sub parse_basic_search { + my ($r)=@_; # Clean up fields for safety for my $field ('basicexp') { $ENV{"form.$field"}=~s/[^\w\s\(\)\-]//g; @@ -907,16 +917,7 @@ sub basicsearch { $concatarg='title' if $ENV{'form.titleonly'}; $query=&build_SQL_query('concat('.$concatarg.')',$ENV{'form.'.'basicexp'}); - - # Get reply (either a hash reference to filehandles or bad connection) -# &Apache::lonnet::logthis("metadata query started:".time); - my $reply=&Apache::lonnet::metadata_query('select * from metadata where '.$query); -# &Apache::lonnet::logthis("metadata query finished:".time); - # Output search results - - &output_results('Basic',$r,$query,$reply,$hidden); - - return OK; + return 'select * from metadata where '.$query; } @@ -1106,7 +1107,7 @@ contacted, etc.) sub output_results { # &Apache::lonnet::logthis("output_results:".time); my $fnum; # search result counter - my ($mode,$r,$query,$replyref,$hidden)=@_; + my ($mode,$r,$replyref,$hidden)=@_; my %rhash=%{$replyref}; my $compiledresult=''; my $timeremain=300; # (seconds) @@ -1116,7 +1117,7 @@ sub output_results { my $viewselect=$ENV{'form.viewselect'}; # # make query information persistent to allow for subsequent revision - my $persistent=&make_persistent(); + my $persistent=&make_persistent(\%ENV); # spit out the results header $r->print(&search_results_header($mode)); $r->rflush(); @@ -1365,6 +1366,9 @@ sub parse_raw_result { &Apache::loncommon::copyrightdescription($Fields{'copyright'}); $Fields{'mimetag'} = &Apache::loncommon::filedescription($Fields{'mime'}); + if ($Fields{'author'}=~/^(\s*|error)$/) { + $Fields{'author'}="Unknown Author"; + } # Put spaces in the keyword list, if needed. $Fields{'keywords'}=~ s/,([A-z])/, $1/g; if ($Fields{'title'}=~ /^\s*$/ ) { @@ -1858,7 +1862,7 @@ sub filled { sub output_blank_field_error { my ($r)=@_; # make query information persistent to allow for subsequent revision - my $persistent=&make_persistent(); + my $persistent=&make_persistent(\%ENV); $r->print(< @@ -1904,7 +1908,7 @@ Output a full html page with an error me sub output_date_error { my ($r,$message)=@_; # make query information persistent to allow for subsequent revision - my $persistent=&make_persistent(); + my $persistent=&make_persistent(\%ENV); $r->print(<