--- loncom/interface/lonsearchcat.pm 2002/06/26 18:19:41 1.131 +++ loncom/interface/lonsearchcat.pm 2002/07/16 15:02:06 1.143 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Search Catalog # -# $Id: lonsearchcat.pm,v 1.131 2002/06/26 18:19:41 matthew Exp $ +# $Id: lonsearchcat.pm,v 1.143 2002/07/16 15:02:06 matthew Exp $ # # Copyright Michigan State University Board of Trustees # @@ -40,7 +40,7 @@ =head1 NAME -lonsearchcat +lonsearchcat - LONCAPA Search Interface =head1 SYNOPSIS @@ -107,17 +107,28 @@ 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 +=item %groupsearch_db -The ubiquitous database hash +Database hash used to save values for the groupsearch RAT interface. =item $diropendb The full path to the (temporary) search database file. This is set and used in &handler() and is also used in &output_results(). +=item %Views + +Hash which associates an output view description with the function +that produces it. Adding a new view type should be as easy as +adding a line to the definition of this hash and making sure the function +takes the proper parameters. + +=item $results_db + +The name of the database results from searches are put in. + =back =cut @@ -130,9 +141,16 @@ my $closebutton; # button that closes t my $importbutton; # button to take the selected results and go to group sorting # -- miscellaneous variables -my %hash; # database hash +my %groupsearch_db; # database hash my $diropendb = ""; # db file +my $results_db = ""; +# View Description Function Pointer +my %Views = ("Detailed Citation View" => \&detailed_citation_view, + "Summary View" => \&summary_view, + "Fielded Format" => \&fielded_format_view, + "XML/SGML" => \&xml_sgml_view ); + ###################################################################### ###################################################################### @@ -160,26 +178,29 @@ string that holds portions of the screen ###################################################################### sub handler { my $r = shift; - untie %hash; + untie %groupsearch_db; $r->content_type('text/html'); $r->send_http_header; return OK if $r->header_only; - + ## + ## Initialize global variables + ## my $domain = $r->dir_config('lonDefDomain'); $diropendb= "/home/httpd/perl/tmp/".&Apache::lonnet::escape($domain). "\_".&Apache::lonnet::escape($ENV{'user.name'})."_searchcat.db"; - + $results_db = "/home/httpd/perl/tmp/".&Apache::lonnet::escape($domain). + '_'.&Apache::lonnet::escape($ENV{'user.name'})."_searchresults.db"; &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, ['catalogmode','launch','acts','mode','form','element', 'reqinterface']); ## - ## Clear out old values from database + ## Clear out old values from groupsearch database ## if ($ENV{'form.launch'} eq '1') { - if (tie(%hash,'GDBM_File',$diropendb,&GDBM_WRCREAT,0640)) { + if (tie(%groupsearch_db,'GDBM_File',$diropendb,&GDBM_WRCREAT,0640)) { &start_fresh_session(); - untie %hash; + untie %groupsearch_db; } else { $r->print('Unable to tie hash to db '. 'file'); @@ -212,28 +233,54 @@ 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); - } elsif ($ENV{'form.reqinterface'} eq 'advanced') { + my $searchtype; + $searchtype = 'Basic' if ($ENV{'form.basicsubmit'} eq 'SEARCH'); + $searchtype = 'Advanced' if ($ENV{'form.advancedsubmit'} eq 'SEARCH'); + if ($searchtype) { + # We are running a search + my ($query,$customquery,$customshow,$libraries) = + (undef,undef,undef,undef); + my $pretty_string; + if ($searchtype eq 'Basic') { + ($query,$pretty_string) = &parse_basic_search($r); + } elsif ($ENV{'form.advancedsubmit'} eq 'SEARCH') { + ($query,$customquery,$customshow,$libraries,$pretty_string) + = &parse_advanced_search($r); + return OK if (! defined($query)); + } + # Output some information to the user. + $r->print(&search_results_header($searchtype,$pretty_string)); + $r->print("Sending search request to LON-CAPA servers.
\n"); + $r->rflush(); + # 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). + my $reply=&Apache::lonnet::metadata_query($query,$customquery, + $customshow,$libraries); + $r->rflush(); + &output_results($searchtype,$r,$reply,$hidden); + } else { + # + # We need to get information to search on + # + # Set the default view if it is not already set. + if (!defined($ENV{'form.viewselect'})) { + $ENV{'form.viewselect'} ="Detailed Citation View"; + } # 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)); + if ($ENV{'form.reqinterface'} eq 'advanced') { + $r->print(&advanced_search_form($closebutton,$hidden)); + } else { + # Output normal search interface + $r->print(&basic_search_form($closebutton,$hidden)); + } } return OK; } @@ -284,20 +331,21 @@ ENDDOCUMENT ' '; # $scrout.=&simplecheckbox('allversions',$ENV{'form.allversions'}); # $scrout.='Search historic archives'; - $scrout.=<Advanced Search + my $checkbox = &simplecheckbox('related',$ENV{'form.related'}); + $scrout.=<Advanced Search +$checkbox use related words +

   $closebutton - - - +END + $scrout.=&selectbox(undef,'viewselect', + $ENV{'form.viewselect'}, + undef,undef,undef, + sort(keys(%Views))); + $scrout.=<

@@ -330,6 +378,9 @@ $closebutton

END + if (!defined($ENV{'form.viewselect'})) { + $ENV{'form.viewselect'} ="Detailed Citation View"; + } my $scrout=<<"ENDHEADER"; @@ -354,47 +405,71 @@ $hidden ENDHEADER - $scrout.=&searchphrasefield('title','title', - $ENV{'form.title'}); - $scrout.=&searchphrasefield('author','author', - $ENV{'form.author'}); - $scrout.=&searchphrasefield('subject','subject', - $ENV{'form.subject'}); - $scrout.=&searchphrasefield('keywords','keywords', - $ENV{'form.keywords'}); - $scrout.=&searchphrasefield('URL','url', - $ENV{'form.url'}); -# $scrout.=&searchphrasefield('Limit by version','version', -# $ENV{'form.version'}); - $scrout.=&searchphrasefield('notes','notes', - $ENV{'form.notes'}); - $scrout.=&searchphrasefield('abstract','abstract', - $ENV{'form.abstract'}); + $scrout.=&selectbox(undef,'viewselect', + $ENV{'form.viewselect'}, + undef,undef,undef, + sort(keys(%Views))); + $scrout.="\n"; + $scrout.=&searchphrasefield_with_related('title', 'title' , + $ENV{'form.title'}); + $scrout.=&searchphrasefield('author', 'author' ,$ENV{'form.author'}); + $scrout.=&searchphrasefield_with_related('subject', 'subject' , + $ENV{'form.subject'}); + $scrout.=&searchphrasefield_with_related('keywords','keywords', + $ENV{'form.keywords'}); + $scrout.=&searchphrasefield('URL', 'url' ,$ENV{'form.url'}); + $scrout.=&searchphrasefield_with_related('notes', 'notes' , + $ENV{'form.notes'}); + $scrout.=&searchphrasefield_with_related('abstract','abstract', + $ENV{'form.abstract'}); # Hack - an empty table row. - $scrout.="\n"; + $scrout.="\n"; $scrout.=&searchphrasefield('file
extension','mime', $ENV{'form.mime'}); - $scrout.="\n"; + $scrout.="\n"; $scrout.=&searchphrasefield('publisher
owner','owner', $ENV{'form.owner'}); $scrout.="
VIEW: - - - -
Related
Words
  
   
  
   
\n"; $ENV{'form.category'}='any' unless length($ENV{'form.category'}); - $scrout.=&selectbox('Limit by file category','category', + $scrout.=&selectbox('File Category','category', $ENV{'form.category'}, 'any','Any category', 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; + my $size = (scalar @domains < ($size - 1) ? scalar @domains + 1 : $size); + # standalone machines do not get to choose a domain to search. + if ((scalar @domains) == 1) { + $scrout .=''."\n"; + } else { + $scrout.="\n".''. + 'DOMAINS
'. + '\n"; + } + #---------------------------------------------------------------- $scrout.=&selectbox('Limit by language','language', $ENV{'form.language'},'any','Any Language', \&{Apache::loncommon::languagedescription}, @@ -493,23 +568,26 @@ to be somewhat persistent. ###################################################################### sub make_persistent { + my %save = %{shift()}; my $persistent=''; - foreach (keys %ENV) { - if (/^form\./ && !/submit/) { - my $name=$_; - my $key=$name; - $ENV{$key}=~s/\'//g; # do not mess with html field syntax + foreach my $name (keys %save) { + if ($name =~ /^form\./ && $name !~ /submit/) { + my @values = (ref($save{$name}) ? @{$save{$name}} : ($save{$name})); $name=~s/^form\.//; - $persistent.=< + foreach (@values) { + s/\"/\'/g; # do not mess with html field syntax + next if (! $_ ); + $persistent.=< END + } } } return $persistent; } - ###################################################################### +# HTML form building functions # ###################################################################### =pod @@ -518,6 +596,13 @@ END =over 4 +=cut + +############################################### +############################################### + +=pod + =item &simpletextfield() Inputs: $name,$value,$size @@ -525,6 +610,23 @@ Inputs: $name,$value,$size Returns a text input field with the given name, value, and size. If size is not specified, a value of 20 is used. +=cut + +############################################### +############################################### + +sub simpletextfield { + my ($name,$value,$size)=@_; + $size = 20 if (! defined($size)); + return ''; +} + +############################################### +############################################### + +=pod + =item &simplecheckbox() Inputs: $name,$value @@ -532,91 +634,106 @@ Inputs: $name,$value Returns a simple check box with the given $name. If $value eq 'on' the box is checked. -=item &searchphrasefield() +=cut -Inputs: $title,$name,$value +############################################### +############################################### -Returns html for a title line and an input field for entering search terms. -the instructions "Enter terms or phrases separated by search operators such -as AND, OR, or NOT." are given following the title. The entry field (which -is where the $name and $value are used) is an 80 column simpletextfield. +sub simplecheckbox { + my ($name,$value)=@_; + my $checked=''; + $checked="checked" if $value eq 'on'; + return ''; +} -=item &dateboxes() +############################################### +############################################### -Returns html selection form elements for the specification of -the day, month, and year. +=pod -=item &selectbox() +=item &fieldtitle() -Returns a scalar containing an html tag. +=pod -=item $default +=item &searchphrasefield() -The default value of the form. Can be $anyvalue or in @idlist. +Inputs: $title,$name,$value -=item $anyvalue +Returns html for a title line and an input field for entering search terms. +The entry field (which is where the $name and $value are used) is a 50 column +simpletextfield. The html returned is for a row in a three column table. -The