[LON-CAPA-cvs] cvs: loncom /interface lonsearchcat.pm
matthew
lon-capa-cvs@mail.lon-capa.org
Sun, 28 Jul 2002 20:02:14 -0000
This is a MIME encoded message
--matthew1027886534
Content-Type: text/plain
matthew Sun Jul 28 16:02:14 2002 EDT
Modified files:
/loncom/interface lonsearchcat.pm
Log:
Major Changes:
Store persistent values in %persistent_db instead of using hidden form
elements.
Global $hidden replaced with $hidden_fields.
Global $closebutton replaced with local variable in &handler.
&handler: Comments changed.
Read/write %persistent_db.
Set $hidden_fields to contain the identifier for %persistent_db.
$closebutton is now passed to many functions.
&advanced_search_form, &basic_search_form, &parse_advanced_search,
&parse_basic_search - pass $closebutton instead of having it global.
&make_persistent and &reconstruct_persistent_form_data: new functions/rewrites
of old functions to store and restore $ENV{'form.*'} values to/from the
%persistent_db.
&run_search: Recommented & moved some code around.
Now add time if we are able to contact a server within a few seconds.
Changed status output text.
&display_buttons is still untested and will remain so until the frames
interface is completed.
&display_results: Now check the database returns and output reasonable
error messages. Moved some code to &catalogmode_output.
Removed the following functions:
&output_results, &make_popwin, &popwin_js, &popwin_imgupdate
--matthew1027886534
Content-Type: text/plain
Content-Disposition: attachment; filename="matthew-20020728160214.txt"
Index: loncom/interface/lonsearchcat.pm
diff -u loncom/interface/lonsearchcat.pm:1.144 loncom/interface/lonsearchcat.pm:1.145
--- loncom/interface/lonsearchcat.pm:1.144 Fri Jul 26 12:37:58 2002
+++ loncom/interface/lonsearchcat.pm Sun Jul 28 16:02:14 2002
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# Search Catalog
#
-# $Id: lonsearchcat.pm,v 1.144 2002/07/26 16:37:58 matthew Exp $
+# $Id: lonsearchcat.pm,v 1.145 2002/07/28 20:02:14 matthew Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -103,10 +103,6 @@
=over 4
-=item $closebutton
-
-button that closes the search window
-
=item $importbutton
button to take the select results and go to group sorting
@@ -127,10 +123,6 @@
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
@@ -139,20 +131,19 @@
######################################################################
# -- 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 %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 );
-
+my $persistent_db_file;
+my %persistent_db;
+my $hidden_fields;
######################################################################
######################################################################
@@ -180,22 +171,50 @@
######################################################################
sub handler {
my $r = shift;
- untie %groupsearch_db;
-
+ #
+ untie %groupsearch_db if (tied(%groupsearch_db));
+ #
+ my $closebutton; # button that closes the search window
+ # This button is different for the RAT compared to
+ # normal invocation.
+ #
$r->content_type('text/html');
$r->send_http_header;
return OK if $r->header_only;
+ ##
+ ## Pick up form fields passed in the links.
+ ##
+ &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
+ ['catalogmode','launch','acts','mode','form','element',
+ 'reqinterface','persistent_db_id','table']);
##
## 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']);
+ #
+ # set the name of the persistent database
+ # $ENV{'form.persistent_db_id'} can only have digits in it.
+ if (! exists($ENV{'form.persistent_db_id'}) ||
+ $ENV{'form.persistent_db_id'} =~ /\D/ ) {
+ $ENV{'form.persistent_db_id'} = time;
+ }
+ $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';
+ #
+ # Read in the database. It should (hopefully) not be catastrophic to
+ # fail in this exercise.
+ if (-e $persistent_db_file) {
+ # Read in the previous values, if we can.
+ if (tie(%persistent_db,'GDBM_File',$persistent_db_file,
+ &GDBM_READER,0640)) {
+ &reconstruct_persistent_form_data($r);
+ untie (%persistent_db);
+ }
+ }
##
## Clear out old values from groupsearch database
##
@@ -210,23 +229,14 @@
}
}
##
- ## Produce some output, so people know it is working
- ##
- $r->print("\n");
- $r->rflush;
- ##
## Configure dynamic components of interface
##
- my $hidden; # Holds 'hidden' html forms
+ $hidden_fields = '<input type="hidden" name="persistent_db_id" value="'.
+ $ENV{'form.persistent_db_id'}.'" />';
if ($ENV{'form.catalogmode'} eq 'interactive') {
- $hidden="<input type='hidden' name='catalogmode' value='interactive'>".
- "\n";
$closebutton="<input type='button' name='close' value='CLOSE' ".
"onClick='self.close()'>"."\n";
} elsif ($ENV{'form.catalogmode'} eq 'groupsearch') {
- $hidden=<<END;
-<input type='hidden' name='catalogmode' value='groupsearch'>
-END
$closebutton=<<END;
<input type='button' name='close' value='CLOSE' onClick='self.close()'>
END
@@ -235,26 +245,29 @@
onClick='javascript:select_group()'>
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?
+ ## Do a search, if needed.
##
my $searchtype;
$searchtype = 'Basic' if ($ENV{'form.basicsubmit'} eq 'SEARCH');
$searchtype = 'Advanced' if ($ENV{'form.advancedsubmit'} eq 'SEARCH');
if ($searchtype) {
+ ##
+ ## make query information persistent to allow for subsequent revision
+ ##
+ tie(%persistent_db,'GDBM_File',$persistent_db_file,&GDBM_WRCREAT,0640);
+ &make_persistent(\%ENV);
+ untie(%persistent_db);
+ #
# 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);
+ ($query,$pretty_string) = &parse_basic_search($r,$closebutton);
} elsif ($ENV{'form.advancedsubmit'} eq 'SEARCH') {
($query,$customquery,$customshow,$libraries,$pretty_string)
- = &parse_advanced_search($r);
+ = &parse_advanced_search($r,$closebutton);
return OK if (! defined($query));
}
# Output some information to the user.
@@ -262,26 +275,38 @@
$r->print("Sending search request to LON-CAPA servers.<br />\n");
$r->rflush();
&run_search($r,$query,$customquery,$customshow,$libraries);
- &display_results($r,$searchtype,$hidden,$importbutton,
- $closebutton);
-
+ ##
+ ## Display the results
+ ##
+ &display_results($r,$searchtype,$importbutton,$closebutton);
$r->rflush();
} 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
- if ($ENV{'form.reqinterface'} eq 'advanced') {
- $r->print(&advanced_search_form($closebutton,$hidden));
- } else {
+ #
+ # remove the requested interface from the environment.
+ my $interface;
+ if ($ENV{'form.reqinterface'}) {
+ $interface = lc($ENV{'form.reqinterface'});
+ } else {
+ $interface = 'basic';
+ }
+ ##
+ ## Determine course of action
+ ##
+ if ($interface eq 'display') {
+ # &display_results($closebutton));
+ } elsif ($interface eq 'advanced') {
+ $r->print(&advanced_search_form($closebutton));
+ } elsif ($interface eq 'basic') {
# Output normal search interface
- $r->print(&basic_search_form($closebutton,$hidden));
+ $r->print(&basic_search_form($closebutton));
}
}
+ untie (%persistent_db);
return OK;
}
@@ -300,7 +325,7 @@
######################################################################
sub basic_search_form{
- my ($closebutton,$hidden) = @_;
+ my ($closebutton) = @_;
my $scrout=<<"ENDDOCUMENT";
<html>
<head>
@@ -317,7 +342,7 @@
<img align='right' src='/adm/lonIcons/lonlogos.gif' />
<h1>Search Catalog</h1>
<form method="post" action="/adm/searchcat">
-$hidden
+$hidden_fields
<h3>Basic Search</h3>
<p>
Enter terms or phrases separated by AND, OR, or NOT
@@ -369,7 +394,7 @@
######################################################################
sub advanced_search_form{
- my ($closebutton,$hidden) = @_;
+ my ($closebutton) = @_;
my $advanced_buttons = <<"END";
<p>
<input type="submit" name="advancedsubmit" value='SEARCH' />
@@ -401,7 +426,7 @@
such as AND, OR, or NOT.<br />
<form method="post" action="/adm/searchcat">
$advanced_buttons
-$hidden
+$hidden_fields
<table>
<tr><td><font color="#800000" face="helvetica"><b>VIEW:</b></font></td>
<td>
@@ -453,22 +478,17 @@
# 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 .='<input type="hidden" name="domains" value="any" />'."\n";
- } else {
- $scrout.="\n".'<font color="#800000" face="helvetica"><b>'.
- 'DOMAINS</b></font><br />'.
- '<select name="domains" size="'.$size.'" multiple>'."\n".
- '<option name="any" value="any" '.
- ($domain_hash{'any'}? 'selected ' :'').
+ $scrout.="\n".'<font color="#800000" face="helvetica"><b>'.
+ 'DOMAINS</b></font><br />'.
+ '<select name="domains" size="'.$size.'" multiple>'."\n".
+ '<option name="any" value="any" '.
+ ($domain_hash{'any'}? 'selected ' :'').
'>all domains</option>'."\n";
- foreach my $dom (sort @domains) {
- $scrout.="<option name=\"$dom\" ".
- ($domain_hash{$dom} ? 'selected ' :'').">$dom</option>\n";
- }
- $scrout.="</select>\n";
+ foreach my $dom (sort @domains) {
+ $scrout.="<option name=\"$dom\" ".
+ ($domain_hash{$dom} ? 'selected ' :'').">$dom</option>\n";
}
+ $scrout.="</select>\n";
#----------------------------------------------------------------
$scrout.=&selectbox('Limit by language','language',
$ENV{'form.language'},'any','Any Language',
@@ -556,34 +576,68 @@
=pod
-=item &make_persistent()
+=item &reconstruct_persistent_form_data
-Returns a scalar which holds the current ENV{'form.*'} values in
-a 'hidden' html input tag. This allows search interface information
-to be somewhat persistent.
+This function is the reverse of &make_persistent();
+Retrieve persistent data from %persistent_db. Retrieved items will have their
+values unescaped. If the item contains commas (before unescaping), the
+returned value will be an array pointer. Items will be returned in the
+environment in $ENV{"form.$name"}.
=cut
######################################################################
######################################################################
+sub reconstruct_persistent_form_data {
+ foreach my $name (keys %persistent_db) {
+ # &Apache::lonnet::logthis("Reconstructing $name = $persistent_db{$name}");
+ my @Values = split(',',$persistent_db{$name});
+ my @value = map { &Apache::lonnet::unescape($_) } @Values;
+ $name = 'form.'.$name;
+ if (exists($ENV{$name})) {
+ if (ref($ENV{$name})) {
+ # Assume it is an array reference
+ $ENV{$name} = [@{$ENV{$name}},@value];
+ } else {
+ $ENV{$name} = [$ENV{$name},@value];
+ }
+ } else {
+ if (@value > 1) {
+ $ENV{$name} = [@value];
+ } else {
+ $ENV{$name} = $value[0];
+ }
+ }
+ }
+ return;
+}
+
+######################################################################
+######################################################################
+
+=pod
+=item &make_persistent()
+
+Store (environment) variables away to the %persistent_db.
+Values will be escaped. Values that are array pointers will have their
+elements escaped and concatenated in a comma seperated string.
+
+=cut
+
+######################################################################
+######################################################################
sub make_persistent {
my %save = %{shift()};
- my $persistent='';
foreach my $name (keys %save) {
- if ($name =~ /^form\./ && $name !~ /submit/) {
- my @values = (ref($save{$name}) ? @{$save{$name}} : ($save{$name}));
- $name=~s/^form\.//;
- foreach (@values) {
- s/\"/\'/g; # do not mess with html field syntax
- next if (! $_ );
- $persistent.=<<END;
-<input type="hidden" name="$name" value="$_" />
-END
- }
- }
+ next if ($name !~ /^form\./ || $name =~ /submit/);
+ my @values = (ref($save{$name}) ? @{$save{$name}} : ($save{$name}));
+ # We handle array references, but not recursively.
+ my $store = join(',', map { &Apache::lonnet::escape($_); } @values );
+ $name=~s/^form\.//;
+ $persistent_db{$name} = $store;
}
- return $persistent;
+ return '';
}
######################################################################
@@ -893,7 +947,7 @@
######################################################################
######################################################################
sub parse_advanced_search {
- my ($r)=@_;
+ my ($r,$closebutton)=@_;
my $fillflag=0;
my $pretty_search_string = "<br />\n";
# Clean up fields for safety
@@ -929,7 +983,7 @@
}
}
unless ($fillflag) {
- &output_blank_field_error($r);
+ &output_blank_field_error($r,$closebutton);
return ;
}
# Turn the form input into a SQL-based query
@@ -992,7 +1046,7 @@
);
# Test to see if date windows are legitimate
if ($datequery=~/^Incorrect/) {
- &output_date_error($r,$datequery);
+ &output_date_error($r,$datequery,$closebutton);
return ;
} elsif ($datequery) {
# Here is where you would set up pretty_search_string to output
@@ -1072,7 +1126,7 @@
######################################################################
######################################################################
sub parse_basic_search {
- my ($r)=@_;
+ my ($r,$closebutton)=@_;
# Clean up fields for safety
for my $field ('basicexp') {
$ENV{"form.$field"}=~s/[^\w\s\(\)\-]//g;
@@ -1086,7 +1140,7 @@
# Check to see if enough is filled in
unless (&filled($ENV{'form.basicexp'})) {
- &output_blank_field_error($r);
+ &output_blank_field_error($r,$closebutton);
return OK;
}
my $pretty_search_string = '<b>'.$ENV{'form.basicexp'}.'</b>';
@@ -1432,6 +1486,13 @@
sub run_search {
my ($r,$query,$customquery,$customshow,$serverlist) = @_;
#
+ # Timing variables
+ #
+ my $starttime = time;
+ my $max_time = 120; # seconds for the search to complete
+ #
+ # Determine the servers we need to contact.
+ #
my @Servers_to_contact;
if (defined($serverlist)) {
@Servers_to_contact = @$serverlist;
@@ -1440,12 +1501,8 @@
}
my %Server_status;
#
- # Timing variables
- my $starttime = time;
- my $max_time = 120; # seconds for the search to complete
- #
# Create Table
- #####################################
+ #
my $table = &Apache::lonmysql::create_table
( { columns => \%Datatypes,
column_order => \@DataOrder,
@@ -1460,9 +1517,13 @@
" your system administrator.");
return;
}
+ ##
+ ## form.table needs to be stored in the persistent database...
+ ##
$ENV{'form.table'}=$table;
#
- #####################################
+ # Prepare for the big loop.
+ #
my $hitcountsum;
my $server;
my $status;
@@ -1474,26 +1535,30 @@
my $server = shift(@Servers_to_contact);
my $reply=&Apache::lonnet::metadata_query($query,$customquery,
$customshow,[$server]);
- # We should let the user know we have contacted another server
($server) = keys(%$reply);
$Server_status{$server} = $reply->{$server};
# &write_status($r,"Contacted:$server:reply:".
# $Server_status{$server});
- # Hmmm, should we add to $max_time if we contact a server?
+ if ($max_time - (time - $starttime) < 20) {
+ # If there are less than 20 seconds to go in the search,
+ # give the newly contacted servers 20 more seconds to
+ # respond....
+ $max_time += 20;
+ }
} else {
sleep(1); # wait a sec. to give time for files to be written
}
while (my ($server,$status) = each(%Server_status)) {
if ($status eq 'con_lost') {
delete ($Server_status{$server});
- # &write_status($r,"Removing $server");
+ # &write_status($r,"server $server is not responding.");
next;
}
$status=~/^([\.\w]+)$/;
my $datafile=$r->dir_config('lonDaemons').'/tmp/'.$1;
if (-e $datafile && ! -e "$datafile.end") {
# Let the user know we are receiving data from the server
- &write_status($r,"$server:Receiving file");
+ # &write_status($r,"$server:Receiving file");
next;
}
if (-e "$datafile.end") {
@@ -1506,7 +1571,8 @@
# Error opening file...
# Tell the user and exit...?
# Should I give up on opening it?
- &write_status("Unable to open $datafile");
+ &write_status("Unable to open search results file for ".
+ "server $server. Omitting from search");
next;
}
# Read in the whole file.
@@ -1530,15 +1596,22 @@
# $server is only deleted if the results file has been
# found and (successfully) opened. This may be a bad idea.
delete($Server_status{$server});
+ #&write_status($r,"Received $new_count more results from ".
+ # $server.".");
}
}
# Finished looping through the servers
}
&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.
- if ($hitcountsum > 0) {
- $r->print("<h3>Total results = $hitcountsum</h3></body></html>");
+ &write_status($r,"Search completed.");
+ if ($hitcountsum) {
+ &write_status($r,$hitcountsum." successful matches to your query.");
+ } else {
+ &write_status($r,"There were no successful matches to your query.");
}
return;
}
@@ -1554,20 +1627,32 @@
######################################################################
######################################################################
sub display_buttons {
- my ($low,$high,$otherparms) = @_;
- my $maxshow = 20;
- my $lowest = ($low - $maxshow < 0 ? 0 : $low-$maxshow);
- my $highest = $high + $maxshow;
- my ($previous,$current,$next);
- if ($lowest < $low) {
- $previous = qq{<a href="/adm/searchcat?$otherparms&mode=display&low=$lowest&high=$highest">prev</a>};
- } else {
- $previous = "prev";
+ my ($current_min,$show,$total,$parms) = @_;
+ return '' if ($show eq 'all'); # No links if you get them all at once.
+ my $links;
+ ##
+ ## Prev
+ my $prev_min = $current_min - $show;
+ $prev_min = 0 if $prev_min < 0;
+ if ($prev_min < $current_min) {
+ $links .= qq{
+<a href="/adm/searchcat?$parms&startwith=$prev_min&show=$show">prev</a>
+};
}
- $current = qq{<a href="/adm/searchcat?$otherparms&mode=display&low=$low&high=$high">reload</a>};
- $next = qq{<a href="/adm/searchcat?$otherparms&mode=display&low=$high&high=$highest">next</a>};
- my $result = $previous." ".$current." ".$next;
- return $result;
+ ##
+ ## Pages.... Someday.
+ ##
+
+ ##
+ ## Next
+ my $next_min = $current_min + $show;
+ my $next_min = $current_min if ($next_min > $total);
+ if ($next_min != $current_min) {
+ $links .= qq{
+<a href="/adm/searchcat?$parms&startwith=$next_min&show=$show">next</a>
+};
+ }
+ return $links;
}
######################################################################
######################################################################
@@ -1581,7 +1666,7 @@
######################################################################
######################################################################
sub display_results {
- my ($r,$mode,$hidden,$importbutton,$closebutton) = @_;
+ my ($r,$mode,$importbutton,$closebutton) = @_;
##
## Set viewing function
##
@@ -1592,10 +1677,6 @@
return;
}
##
- ## make query information persistent to allow for subsequent revision
- ##
- my $persistent=&make_persistent(\%ENV);
- ##
## Get the catalog controls setup
##
my $action = "/adm/searchcat";
@@ -1606,13 +1687,12 @@
}
$r->print(<<CATALOGCONTROLS);
<form name='results' method="post" action="$action">
-$hidden
+$hidden_fields
<input type='hidden' name='acts' value='' />
<input type='button' value='Revise search request'
onClick='this.form.submit();' />
$importbutton
$closebutton
-$persistent
<hr />
CATALOGCONTROLS
if (! tie(%groupsearch_db,'GDBM_File',$diropendb,&GDBM_WRCREAT,0640)) {
@@ -1620,52 +1700,75 @@
$r->rflush();
return;
}
- #
- my $fnum;
- # For now, just query the whole lot and spit them out.
+ ##
+ ## Prepare the table for querying
+ ##
my $table = $ENV{'form.table'};
my $connection_result = &Apache::lonmysql::connect_to_db();
if (!defined($connection_result)) {
&write_status($r,&Apache::lonmysql::get_error());
}
- my @Results = &Apache::lonmysql::get_rows($table,'id>=0');
- #&write_status($r,&Apache::lonmysql::get_debug());
- #&write_status($r,&Apache::lonmysql::get_error());
+ my $table_check = &Apache::lonmysql::check_table($table);
+ if (! defined($table_check)) {
+ $r->print("A MySQL error has occurred.</body></html>");
+ &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;
+ }
+ ##
+ ## 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.</body></html>");
+ &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;
+ }
+ if ($total_results == 0) {
+ $r->print("There were no results matching your query.\n".
+ "</form></body></html>");
+ return;
+ }
+ ##
+ ## Determine how many results we need to get
+ ##
+ $ENV{'form.startwith'} = 0 if (! exists($ENV{'form.startwith'}));
+ $ENV{'form.show'} = 'all' if (! exists($ENV{'form.show'}));
+ my $min = $ENV{'form.startwith'};
+ my $max;
+ if ($ENV{'form.show'} eq 'all') {
+ $max = $total_results ;
+ } else {
+ $max = $min + $ENV{'form.show'};
+ }
+ ##
+ ## Output links (if necessary) for 'prev' and 'next' pages.
+ ##
+
+ ##
+ ## Get results from MySQL table
+ ##
+ my @Results = &Apache::lonmysql::get_rows($table,
+ 'id>'.$min.' AND id<='.$max);
+ ##
+ ## Loop through the results and output them.
+ ##
foreach my $row (@Results) {
my %Fields = %{&parse_row(@$row)};
- my $output="\n<p>\n";
- if ($ENV{'form.catalogmode'} eq 'interactive') {
- my $titleesc=$Fields{'title'};
- $titleesc=~s/\'/\\'/; # '
- if ($ENV{'form.catalogmode'} eq 'interactive') {
- $output.=<<END
-<font size='-1'><INPUT TYPE="button" NAME="returnvalues" VALUE="SELECT"
-onClick="javascript:select_data('$titleesc','$Fields{'url'}')">
-</font>
-<br />
-END
- }
- }
- if ($ENV{'form.catalogmode'} eq 'groupsearch') {
- $fnum+=0;
- $groupsearch_db{"pre_${fnum}_link"}=$Fields{'url'};
- $groupsearch_db{"pre_${fnum}_title"}=$Fields{'title'};
- $output.=<<END;
-<font size='-1'>
-<input type="checkbox" name="returnvalues" value="SELECT"
-onClick="javascript:queue($fnum)" />
-</font>
-<br />
-END
-# <input type="hidden" name="title$fnum" value="$title" />
-# <input type="hidden" name="url$fnum" value="$url" />
- $fnum++;
- }
+ my $output="<p>\n";
+ $output.=&catalogmode_output($Fields{'title'},$Fields{'url'});
# Render the result into html
$output.= &$viewfunction(%Fields);
- if ($output) {
- $output.="<hr align='left' width='200' noshade />";
- }
+ $output.="</p>\n<hr align='left' width='200' noshade />";
+ # Print them out as they come in.
$r->print($output);
$r->rflush();
}
@@ -1683,6 +1786,53 @@
=pod
+=item &catalogmode_output($title,$url)
+
+Returns html needed for the various catalog modes. Gets inputs from
+$ENV{'form.catalogmode'}. Stores data in %groupsearch_db and $fnum
+(local variable).
+
+=cut
+
+######################################################################
+######################################################################
+{
+my $fnum;
+
+sub catalogmode_output {
+ my $output = '';
+ my ($title,$url) = @_;
+ if ($ENV{'form.catalogmode'} eq 'interactive') {
+ $title=~ s/\'/\\'/g; # ' Escape single quotes.
+ if ($ENV{'form.catalogmode'} eq 'interactive') {
+ $output.=<<END
+<font size='-1'><INPUT TYPE="button" NAME="returnvalues" VALUE="SELECT"
+onClick="javascript:select_data('$title','$url')">
+</font>
+END
+ }
+ }
+ if ($ENV{'form.catalogmode'} eq 'groupsearch') {
+ $fnum+=0;
+ $groupsearch_db{"pre_${fnum}_link"}=$url;
+ $groupsearch_db{"pre_${fnum}_title"}=$title;
+ $output.=<<END;
+<font size='-1'>
+<input type="checkbox" name="returnvalues" value="SELECT"
+onClick="javascript:queue($fnum)" />
+</font>
+END
+ $fnum++;
+ }
+ return $output;
+}
+
+}
+######################################################################
+######################################################################
+
+=pod
+
=item &parse_row
Parse a row returned from the database.
@@ -1705,235 +1855,6 @@
&Apache::loncommon::filedescription($Fields{'mime'});
return \%Fields;
}
-######################################################################
-######################################################################
-
-=pod
-
-=item &output_results()
-
-Format and output results based on a reply list.
-There are two windows that this function writes to. The main search
-window ("srch") has a listing of the results. A secondary window ("popwin")
-gives the status of the network search (time elapsed, number of machines
-contacted, etc.)
-
-=cut
-
-######################################################################
-######################################################################
-sub output_results {
-# &Apache::lonnet::logthis("output_results:".time);
- my $fnum; # search result counter
- my ($mode,$r,$replyref,$hidden)=@_;
- my %rhash=%{$replyref};
- my $compiledresult='';
- my $timeremain=300; # (seconds)
- my $elapsetime=0;
- my $resultflag=0;
- my $tflag=1;
- ##
- ## Set viewing function
- ##
- my $viewfunction = $Views{$ENV{'form.viewselect'}};
- if (!defined($viewfunction)) {
- $r->print("Internal Error - Bad view selected.\n");
- $r->rflush();
- return;
- }
- #
- # make query information persistent to allow for subsequent revision
- my $persistent=&make_persistent(\%ENV);
- #
- # Begin producing output
- $r->rflush();
- #
- # begin showing the cataloged results
- my $action = "/adm/searchcat";
- if ($mode eq 'Basic') {
- $action .= "?reqinterface=basic";
- } elsif ($mode eq 'Advanced') {
- $action .= "?reqinterface=advanced";
- }
- $r->print(<<CATALOGCONTROLS);
-<form name='results' method="post" action="$action">
-$hidden
-<input type='hidden' name='acts' value='' />
-<input type='button' value='Revise search request'
-onClick='this.form.submit();' />
-$importbutton
-$closebutton
-$persistent
-<hr />
-CATALOGCONTROLS
- #
- # make the pop-up window for status
- $r->print(&make_popwin(%rhash));
- $r->rflush();
- ##
- ## Prepare for the main loop below
- ##
- my $servercount=0;
- my $hitcountsum=0;
- my $servernum=(keys %rhash);
- my $serversleft=$servernum;
- ##
- ## Run until we run out of time or we run out of servers
- ##
- while($serversleft && $timeremain) {
- ##
- ## %rhash has servers deleted from it as results come in
- ## (within the foreach loop below).
- ##
- foreach my $rkey (sort keys %rhash) {
-# &Apache::lonnet::logthis("Server $rkey:".time);
- $servercount++;
- $compiledresult='';
- my $reply=$rhash{$rkey};
- my @results;
- if ($reply eq 'con_lost') {
- &popwin_imgupdate($r,$rkey,"srvbad.gif");
- $serversleft--;
- delete $rhash{$rkey};
- } else {
- # must do since 'use strict' checks for tainting
- $reply=~/^([\.\w]+)$/;
- my $replyfile=$r->dir_config('lonDaemons').'/tmp/'.$1;
- $reply=~/(.*?)\_/;
- for (my $counter=0;$counter<2;$counter++) {
- if (-e $replyfile && ! -e "$replyfile.end") {
- &popwin_imgupdate($r,$rkey,"srvhalf.gif");
- &popwin_js($r,'popwin.hc["'.$rkey.'"]='.
- '"still transferring..."'.';');
- }
- # Are we finished transferring data?
- if (-e "$replyfile.end") {
- $serversleft--;
- delete $rhash{$rkey};
- if (-s $replyfile) {
- &popwin_imgupdate($r,$rkey,"srvgood.gif");
- my $fh;
- unless ($fh=Apache::File->new($replyfile)){
- # Is it really appropriate to die on this error?
- $r->print('ERROR: file '.
- $replyfile.' cannot be opened');
- return OK;
- }
- @results=<$fh> if $fh;
- my $hits =@results;
- &popwin_js($r,'popwin.hc["'.$rkey.'"]='.
- $hits.';');
- $hitcountsum+=$hits;
- &popwin_js($r,'popwin.document.forms.popremain.'.
- 'numhits.value='.$hitcountsum.';');
- } else {
- &popwin_imgupdate($r,$rkey,"srvempty.gif");
- &popwin_js($r,'popwin.hc["'.$rkey.'"]=0;');
- }
- last;
- } # end of if ( -e "$replyfile.end")
- last unless $timeremain;
- sleep 1; # wait for daemons to write files?
- $timeremain--;
- $elapsetime++;
- &popwin_js($r,"popwin.document.popremain.".
- "elapsetime.value=$elapsetime;");
- }
- &popwin_js($r,'popwin.document.whirly.'.
- 'src="/adm/lonIcons/lonanimend.gif";');
- } # end of if ($reply eq 'con_lost') else statement
- my %Fields = undef; # Holds the data to be sent to the various
- # *_view routines.
- my ($extrashow,$customfields,$customhash) =
- &handle_custom_fields(\@results);
- my @customfields = @$customfields;
- my %customhash = %$customhash;
- untie %groupsearch_db if (tied %groupsearch_db);
- #
- if (! tie(%groupsearch_db,'GDBM_File',$diropendb,&GDBM_WRCREAT,0640)) {
- $r->print('<html><head></head><body>Unable to tie hash to db '.
- 'file</body></html>');
- } else {
- if ($ENV{'form.launch'} eq '1') {
- &start_fresh_session();
- }
- foreach my $result (@results) {
- next if $result=~/^custom\=/;
- chomp $result;
- next unless $result;
- %Fields = &parse_raw_result($result,$rkey);
- #
- # Check copyright tags and skip results the user cannot use
- my (undef,undef,$resdom,$resname) = split('/',$Fields{'url'});
- # Check for priv
- if (($Fields{'copyright'} eq 'priv') &&
- (($ENV{'user.name'} ne $resname) &&
- ($ENV{'user.domain'} ne $resdom))) {
- next;
- }
- # Check for domain
- if (($Fields{'copyright'} eq 'domain') &&
- ($ENV{'user.domain'} ne $resdom)) {
- next;
- }
- #
- $Fields{'extrashow'}=$extrashow;
- if ($extrashow) {
- foreach my $field (@customfields) {
- my $value='';
- $value = $1 if ($customhash{$Fields{'url'}}=~/\<{$field}[^\>]*\>(.*?)\<\/{$field}[^\>]*\>/s);
- $Fields{'extrashow'}=~s/\<\!\-\- $field \-\-\>/ $value/g;
- }
- }
- $compiledresult.="\n<p>\n";
- if ($ENV{'form.catalogmode'} eq 'interactive') {
- my $titleesc=$Fields{'title'};
- $titleesc=~s/\'/\\'/; # '
- $compiledresult.=<<END if ($ENV{'form.catalogmode'} eq 'interactive');
-<font size='-1'><INPUT TYPE="button" NAME="returnvalues" VALUE="SELECT"
-onClick="javascript:select_data('$titleesc','$Fields{'url'}')">
-</font>
-<br />
-END
- }
- if ($ENV{'form.catalogmode'} eq 'groupsearch') {
- $fnum+=0;
- $groupsearch_db{"pre_${fnum}_link"}=$Fields{'url'};
- $groupsearch_db{"pre_${fnum}_title"}=$Fields{'title'};
- $compiledresult.=<<END;
-<font size='-1'>
-<input type="checkbox" name="returnvalues" value="SELECT"
-onClick="javascript:queue($fnum)" />
-</font>
-<br />
-END
-# <input type="hidden" name="title$fnum" value="$title" />
-# <input type="hidden" name="url$fnum" value="$url" />
- $fnum++;
- }
- # Render the result into html
- $compiledresult.= &$viewfunction(%Fields, hostname => $rkey );
- if ($compiledresult or $servercount!=$servernum) {
- $compiledresult.="<hr align='left' width='200' noshade />";
- }
- }
- untie %groupsearch_db;
- }
- if ($compiledresult) {
- $resultflag=1;
- $r->print($compiledresult);
- }
- } # End of foreach loop over servers remaining
- } # End of big loop - while($serversleft && $timeremain)
- unless ($resultflag) {
- $r->print("\nThere were no results that matched your query\n");
- }
- $r->print('<script type="text/javascript">'.'popwin.close()</script>'.
- "\n");
- $r->print("</body>\n</html>\n");
- $r->rflush();
- return;
-}
###########################################################
###########################################################
@@ -2214,99 +2135,6 @@
######################################################################
######################################################################
-=pod
-
-=item &make_popwin()
-
-Returns html with javascript in it to open up the status window.
-
-=cut
-
-######################################################################
-######################################################################
-sub make_popwin {
- my %rhash = @_;
- my $servernum=(keys %rhash);
- my $hcinit;
- my $grid="'<br />'+\n";
- # $sn is the server number, used ONLY to make sure we have
- # rows of 10 each. No longer used to index images.
- my $sn=1;
- foreach my $sk (sort keys %rhash) {
- $grid.="'<a href=\"";
- $grid.="javascript:opener.displayinfo('+";
- $grid.="\"'\"+'";
- $grid.=$sk;
- my $hc;
- if ($rhash{$sk} eq 'con_lost') {
- $hc="BAD CONNECTION ";
- }
- else {
- $hc="'+\"'\"+\"+hc['$sk']+\"+\"'\"+'";
- $hcinit.="hc[\"$sk\"]=\"not yet connected...\";";
- }
- $grid.=" hitcount=".$hc;
- $grid.=" domain=".$Apache::lonnet::hostdom{$sk};
- $grid.=" IP=".$Apache::lonnet::hostip{$sk};
- # '+"'"+'">'+
- $grid.="'+\"'\"+')\">'+";
- $grid.="\n";
- $grid.="'<img border=\"0\" name=\"img_".$Apache::lonnet::hostdom{$sk}.
- '_'.$sk."\" src=\"/adm/lonIcons/srvnull.gif\" alt=\"".$sk.
- "\" /></a>'+\n";
- $grid.="'<br />'+\n" unless $sn%10;
- $sn++;
- }
- my $result.=<<ENDPOP;
-<script type="text/javascript">
- popwin=open('','popwin','scrollbars=1,width=400,height=220');
- popwin.focus();
- popwin.document.writeln('<'+'html>');
- popwin.document.writeln('<'+'head>');
- popwin.document.writeln('<'+'script>');
- popwin.document.writeln('hc=new Array();$hcinit');
- popwin.document.writeln('<'+'/script>');
- popwin.document.writeln('<'+'/head>'+
- '<'+'body bgcolor="#FFFFFF">'+
- '<'+'image name="whirly" align="right" src="/adm/lonIcons/'+
- 'lonanim.gif" '+
- 'alt="animated logo" />'+
- '<'+'h3>Search Results Progress<'+'/h3>'+
- '<'+'form name="popremain">'+
- '<'+'tt>'+
- '<'+'br clear="all"/><i>PLEASE BE PATIENT</i>'+
- '<'+'br />SCANNING $servernum SERVERS'+
- '<'+'br clear="all" />Number of record hits found '+
- '<'+'input type="text" size="10" name="numhits"'+
- ' value="0" />'+
- '<'+'br clear="all" />Time elapsed '+
- '<'+'input type="text" size="10" name="elapsetime"'+
- ' value="0" />'+
- '<'+'br />'+
- 'SERVER GRID (click on any cell for details)'+
- $grid
- '<'+'br />'+
- 'Server details '+
- '<'+'input type="text" size="35" name="sdetails"'+
- ' value="" />'+
- '<'+'br />'+
- ' <'+'input type="button" name="button"'+
- ' value="close this window" '+
- ' onClick="javascript:opener.abortsearch()" />'+
- ' <'+'input type="button" name="button"'+
- ' value="help" onClick="javascript:opener.openhelp()" />'+
- '<'+'/tt>'+
- '<'+'/form>'+
- '<'+'/body><'+'/html>');
- popwin.document.close();
-</script>
-ENDPOP
- return $result;
-}
-
-######################################################################
-######################################################################
-
=pod
=item Metadata Viewing Functions
@@ -2490,10 +2318,8 @@
######################################################################
######################################################################
sub output_blank_field_error {
- my ($r)=@_;
+ my ($r,$closebutton)=@_;
# make query information persistent to allow for subsequent revision
- my $persistent=&make_persistent(\%ENV);
-
$r->print(<<BEGINNING);
<html>
<head>
@@ -2505,7 +2331,7 @@
<img align='right' src='/adm/lonIcons/lonlogos.gif' />
<h1>Search Catalog</h1>
<form method="post" action="/adm/searchcat">
-$persistent
+$hidden_fields
<input type='button' value='Revise search request'
onClick='this.form.submit();' />
$closebutton
@@ -2531,15 +2357,19 @@
Output a full html page with an error message.
+Inputs:
+
+ $r, the request pointer.
+ $message, the error message for the user.
+ $closebutton, the specialized close button needed for groupsearch.
+
=cut
######################################################################
######################################################################
sub output_date_error {
- my ($r,$message)=@_;
+ my ($r,$message,$closebutton)=@_;
# make query information persistent to allow for subsequent revision
- my $persistent=&make_persistent(\%ENV);
-
$r->print(<<RESULTS);
<html>
<head>
@@ -2549,7 +2379,7 @@
<img align='right' src='/adm/lonIcons/lonlogos.gif' />
<h1>Search Catalog</h1>
<form method="post" action="/adm/searchcat">
-$persistent
+$hidden_fields
<input type='button' value='Revise search request'
onClick='this.form.submit();' />
$closebutton
@@ -2588,51 +2418,6 @@
}
}
}
-
-######################################################################
-######################################################################
-
-=pod
-
-=item &popwin_js() send javascript to popwin
-
-=cut
-
-######################################################################
-######################################################################
-sub popwin_js {
- # Print javascript out to popwin, but make sure we dont generate
- # any javascript errors in doing so.
- my ($r,$text) = @_;
- $r->print(<<"END");
-<script type="text/javascript">
- if (! popwin.closed) {
- $text
- }
-</script>
-END
- $r->rflush();
-}
-
-######################################################################
-######################################################################
-
-=pod
-
-=item &popwin_imgupdate()
-
-Send a given image (and its location) out to the browser. Takes as
-input $r, loncapa server id, and an icon URL.
-
-=cut
-
-######################################################################
-######################################################################
-sub popwin_imgupdate {
- my ($r,$server,$icon) = @_;
- &popwin_js($r,'popwin.document.img_'.$Apache::lonnet::hostdom{$server}.
- '_'.$server.'.'.'src="/adm/lonIcons/'.$icon.'";');
-}
1;
--matthew1027886534--