--- loncom/interface/lonsearchcat.pm 2002/06/24 15:09:52 1.126 +++ loncom/interface/lonsearchcat.pm 2002/07/08 20:35:36 1.139 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Search Catalog # -# $Id: lonsearchcat.pm,v 1.126 2002/06/24 15:09:52 matthew Exp $ +# $Id: lonsearchcat.pm,v 1.139 2002/07/08 20:35:36 matthew Exp $ # # Copyright Michigan State University Board of Trustees # @@ -67,14 +67,14 @@ search (on a server basis) is displayed ############################################################################### ############################################################################### +############################################################################### ## ## ## ORGANIZATION OF THIS PERL MODULE ## ## ## ## 1. Modules used by this module ## -## 2. Choices for different output views (detailed, summary, xml, etc) ## -## 3. BEGIN block (to be run once after compilation) ## -## 4. Handling routine called via Apache and mod_perl ## -## 5. Other subroutines ## +## 2. Variables used throughout the module ## +## 3. handler subroutine called via Apache and mod_perl ## +## 4. Other subroutines ## ## ## ############################################################################### @@ -101,25 +101,13 @@ use Apache::loncommon(); =over 4 -=item %hostdomains - -matches host name to host domain - -=item %hostips - -matches host name to host ip - -=item %hitcount - -stores number of hits per host - =item $closebutton 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 @@ -130,6 +118,13 @@ The ubiquitous database hash 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. + =back =cut @@ -137,46 +132,19 @@ used in &handler() and is also used in & ###################################################################### ###################################################################### -# -- information holders -my %hostdomains; # matches host name to host domain -my %hostips; # matches host name to host ip -my %hitcount; # stores number of hits per host - # -- dynamically rendered interface components my $closebutton; # button that closes the search window my $importbutton; # button to take the selected results and go to group sorting # -- miscellaneous variables -my $yourself; # allows for quickly limiting to oneself my %hash; # database hash +my $diropendb = ""; # db file -# ------------------------------------------ choices for different output views -# Detailed Citation View ---> sub detailed_citation_view -# Summary View ---> sub summary_view -# Fielded Format ---> sub fielded_format_view -# XML/SGML ---> sub xml_sgml_view - -#------------------------------------------------------------- global variables -my $diropendb = ""; -my $domain = ""; - -# ----------------------------------------------------------------------- BEGIN - -=pod - -=item BEGIN block - -Load %hostdomains and %hostips with data from lonnet.pm. Only library -servers are considered. - -=cut - -BEGIN { - foreach (keys (%Apache::lonnet::libserv)) { - $hostdomains{$_}=$Apache::lonnet::hostdom{$_}; - $hostips{$_}=$Apache::lonnet::hostip{$_}; - } -} +# 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 ); ###################################################################### ###################################################################### @@ -257,28 +225,49 @@ 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,\%ENV,$hidden); - } elsif ($ENV{'form.advancedsubmit'} eq 'SEARCH') { - # Perform advanced search and give results - return &advancedsearch($r,\%ENV,$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); + 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); + } 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; } @@ -318,7 +307,8 @@ sub basic_search_form{ $hidden

Basic Search

-Enter terms or phrases separated by AND, OR, or NOT then press SEARCH below. +Enter terms or phrases separated by AND, OR, or NOT +then press SEARCH below.

@@ -328,21 +318,18 @@ ENDDOCUMENT ' '; # $scrout.=&simplecheckbox('allversions',$ENV{'form.allversions'}); # $scrout.='Search historic archives'; - $scrout.=<
Advanced Search

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

@@ -367,6 +354,17 @@ Returns a scalar which holds html for th sub advanced_search_form{ my ($closebutton,$hidden) = @_; + my $advanced_buttons = <<"END"; +

+ + +$closebutton + +

+END + if (!defined($ENV{'form.viewselect'})) { + $ENV{'form.viewselect'} ="Detailed Citation View"; + } my $scrout=<<"ENDHEADER"; @@ -381,35 +379,76 @@ sub advanced_search_form{ -

Search Catalog

+

Advanced Catalog Search

+
+Enter terms or phrases separated by search operators +such as AND, OR, or NOT.
+$advanced_buttons $hidden -
-

Advanced Search

+ + +\n"; + $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('notes', 'notes' ,$ENV{'form.notes'}); + $scrout.=&searchphrasefield('abstract','abstract',$ENV{'form.abstract'}); + # Hack - an empty table row. + $scrout.="\n"; + $scrout.=&searchphrasefield('file
extension','mime', + $ENV{'form.mime'}); + $scrout.="\n"; + $scrout.=&searchphrasefield('publisher
owner','owner', + $ENV{'form.owner'}); + $scrout.="
VIEW: ENDHEADER - $scrout.=&searchphrasefield('Limit by title','title', - $ENV{'form.title'}); - $scrout.=&searchphrasefield('Limit by author','author', - $ENV{'form.author'}); - $scrout.=&searchphrasefield('Limit by subject','subject', - $ENV{'form.subject'}); - $scrout.=&searchphrasefield('Limit by keywords','keywords', - $ENV{'form.keywords'}); - $scrout.=&searchphrasefield('Limit by URL','url', - $ENV{'form.url'}); -# $scrout.=&searchphrasefield('Limit by version','version', -# $ENV{'form.version'}); - $scrout.=&searchphrasefield('Limit by notes','notes', - $ENV{'form.notes'}); - $scrout.=&searchphrasefield('Limit by abstract','abstract', - $ENV{'form.abstract'}); - $ENV{'form.mime'}='any' unless length($ENV{'form.mime'}); - $scrout.=&selectbox('Limit by MIME type','mime', - $ENV{'form.mime'}, - 'any','Any type', - \&{Apache::loncommon::filedescriptionex}, - (&Apache::loncommon::fileextensions)); + $scrout.=&selectbox(undef,'viewselect', + $ENV{'form.viewselect'}, + undef,undef,undef, + sort(keys(%Views))); + $scrout.="
  
  
\n"; + $ENV{'form.category'}='any' unless length($ENV{'form.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}, @@ -455,8 +494,6 @@ LASTREVISIONDATEEND $ENV{'form.lastrevisiondateend_year'}, ); $scrout.='

'; - $scrout.=&searchphrasefield('Limit by publisher/owner','owner', - $ENV{'form.owner'}); $ENV{'form.copyright'}='any' unless length($ENV{'form.copyright'}); $scrout.=&selectbox('Limit by copyright/distribution','copyright', $ENV{'form.copyright'}, @@ -485,21 +522,7 @@ in a fielded listing for each record res CUSTOMSHOW $scrout.=&simpletextfield('customshow',$ENV{'form.customshow'}); $scrout.=< - - -$closebutton - - - - -

+$advanced_buttons @@ -524,16 +547,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; @@ -579,7 +605,47 @@ the day, month, and year. =item &selectbox() -Returns html selection form. +Returns a scalar containing an html tag. + +=item $default + +The default value of the form. Can be $anyvalue, or in @idlist. + +=item $anyvalue + +The