version 1.121, 2002/06/18 21:36:38
|
version 1.124, 2002/06/20 14:31:31
|
Line 121 button that closes the search window
|
Line 121 button that closes the search window
|
|
|
button to take the selecte results and go to group sorting |
button to take the selecte results and go to group sorting |
|
|
=item $hidden |
|
|
|
holds 'hidden' html forms |
|
|
|
=item $scrout |
|
|
|
string that holds portions of the screen output |
|
|
|
=item $yourself |
|
|
|
allows for quickly limiting to oneself |
|
|
|
=item %hash |
=item %hash |
|
|
The ubiquitous database hash |
The ubiquitous database hash |
|
|
=item $basicviewselect and $advancedviewselect |
|
|
|
View selection forms. These are not actually global and will be |
|
moved soon. |
|
|
|
=item $diropendb |
=item $diropendb |
|
|
The full path to the (temporary) search database file. This is set and |
The full path to the (temporary) search database file. This is set and |
Line 162 my %hitcount; # stores number of hits
|
Line 145 my %hitcount; # stores number of hits
|
# -- dynamically rendered interface components |
# -- dynamically rendered interface components |
my $closebutton; # button that closes the search window |
my $closebutton; # button that closes the search window |
my $importbutton; # button to take the selected results and go to group sorting |
my $importbutton; # button to take the selected results and go to group sorting |
my $hidden; # Holds 'hidden' html forms |
|
|
|
# -- miscellaneous variables |
# -- miscellaneous variables |
my $scrout; # string that holds portions of the screen output |
|
my $yourself; # allows for quickly limiting to oneself |
my $yourself; # allows for quickly limiting to oneself |
my %hash; # database hash |
my %hash; # database hash |
|
|
Line 174 my %hash; # database hash
|
Line 155 my %hash; # database hash
|
# Summary View ---> sub summary_view |
# Summary View ---> sub summary_view |
# Fielded Format ---> sub fielded_format_view |
# Fielded Format ---> sub fielded_format_view |
# XML/SGML ---> sub xml_sgml_view |
# XML/SGML ---> sub xml_sgml_view |
my $basicviewselect=<<END; |
|
<select name='basicviewselect'> |
|
<option value='Detailed Citation View' selected="true"> |
|
Detailed Citation View</option> |
|
<option value='Summary View'>Summary View</option> |
|
<option value='Fielded Format'>Fielded Format</option> |
|
<option value='XML/SGML'>XML/SGML</option> |
|
</select> |
|
END |
|
my $advancedviewselect=<<END; |
|
<select name='advancedviewselect'> |
|
<option value='Detailed Citation View' selected="true"> |
|
Detailed Citation View</option> |
|
<option value='Summary View'>Summary View</option> |
|
<option value='Fielded Format'>Fielded Format</option> |
|
<option value='XML/SGML'>XML/SGML</option> |
|
</select> |
|
END |
|
|
|
#------------------------------------------------------------- global variables |
#------------------------------------------------------------- global variables |
my $diropendb = ""; |
my $diropendb = ""; |
Line 222 BEGIN {
|
Line 185 BEGIN {
|
|
|
=item &handler() - main handler invoked by httpd child |
=item &handler() - main handler invoked by httpd child |
|
|
|
=item Variables |
|
|
|
=over 4 |
|
|
|
=item $hidden |
|
|
|
holds 'hidden' html forms |
|
|
|
=item $scrout |
|
|
|
string that holds portions of the screen output |
|
|
|
=back |
|
|
=cut |
=cut |
|
|
###################################################################### |
###################################################################### |
###################################################################### |
###################################################################### |
# ----------------------------- Handling routine called via Apache and mod_perl |
|
sub handler { |
sub handler { |
my $r = shift; |
my $r = shift; |
untie %hash; |
untie %hash; |
Line 236 sub handler {
|
Line 212 sub handler {
|
return OK if $r->header_only; |
return OK if $r->header_only; |
|
|
my $domain = $r->dir_config('lonDefDomain'); |
my $domain = $r->dir_config('lonDefDomain'); |
$diropendb= "/home/httpd/perl/tmp/".&Apache::lonnet::unescape($domain). |
$diropendb= "/home/httpd/perl/tmp/".&Apache::lonnet::escape($domain). |
"\_".&Apache::lonnet::unescape($ENV{'user.name'})."_searchcat.db"; |
"\_".&Apache::lonnet::escape($ENV{'user.name'})."_searchcat.db"; |
|
|
&Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, |
&Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, |
['catalogmode','launch','acts','mode','form','element']); |
['catalogmode','launch','acts','mode','form','element', |
|
'reqinterface']); |
|
## |
|
## Clear out old values from database |
|
## |
if ($ENV{'form.launch'} eq '1') { |
if ($ENV{'form.launch'} eq '1') { |
if (tie(%hash,'GDBM_File',$diropendb,&GDBM_WRCREAT,0640)) { |
if (tie(%hash,'GDBM_File',$diropendb,&GDBM_WRCREAT,0640)) { |
&start_fresh_session(); |
&start_fresh_session(); |
untie %hash; |
untie %hash; |
} |
} else { |
else { |
|
$r->print('<html><head></head><body>Unable to tie hash to db '. |
$r->print('<html><head></head><body>Unable to tie hash to db '. |
'file</body></html>'); |
'file</body></html>'); |
return OK; |
return OK; |
} |
} |
} |
} |
|
## |
# --------------------------- Produce some output, so people know it is working |
## Produce some output, so people know it is working |
|
## |
$r->print("\n"); |
$r->print("\n"); |
$r->rflush; |
$r->rflush; |
|
## |
# ----------------------------------- configure dynamic components of interface |
## Configure dynamic components of interface |
|
## |
|
my $hidden; # Holds 'hidden' html forms |
if ($ENV{'form.catalogmode'} eq 'interactive') { |
if ($ENV{'form.catalogmode'} eq 'interactive') { |
$hidden="<input type='hidden' name='catalogmode' value='interactive'>". |
$hidden="<input type='hidden' name='catalogmode' value='interactive'>". |
"\n"; |
"\n"; |
$closebutton="<input type='button' name='close' value='CLOSE' ". |
$closebutton="<input type='button' name='close' value='CLOSE' ". |
"onClick='self.close()'>"."\n"; |
"onClick='self.close()'>"."\n"; |
} |
} elsif ($ENV{'form.catalogmode'} eq 'groupsearch') { |
elsif ($ENV{'form.catalogmode'} eq 'groupsearch') { |
|
$hidden=<<END; |
$hidden=<<END; |
<input type='hidden' name='catalogmode' value='groupsearch'> |
<input type='hidden' name='catalogmode' value='groupsearch'> |
END |
END |
Line 285 END
|
Line 263 END
|
<input type='hidden' name='element' value='$ENV{'form.element'}'> |
<input type='hidden' name='element' value='$ENV{'form.element'}'> |
<input type='hidden' name='date' value='2'> |
<input type='hidden' name='date' value='2'> |
END |
END |
# ------------------------------------------------------ Determine current user |
## |
$yourself=$ENV{'user.name'}.'@'.$ENV{'user.domain'}; |
## What are we doing? |
|
## |
# --- Now, depending on the interface actions, do one of three things here: |
|
# --- 1. a basic search |
|
# --- 2. an advanced search |
|
# --- 3. output a search interface |
|
|
|
# ----------------------------------- See if a search invocation should be done |
|
if ($ENV{'form.basicsubmit'} eq 'SEARCH') { |
if ($ENV{'form.basicsubmit'} eq 'SEARCH') { |
untie %hash; return &basicsearch($r,\%ENV); |
# 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') { |
|
# 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)); |
} |
} |
elsif ($ENV{'form.advancedsubmit'} eq 'SEARCH') { |
return OK; |
untie %hash; return &advancedsearch($r,\%ENV); |
} |
|
|
|
###################################################################### |
|
###################################################################### |
|
|
|
=pod |
|
|
|
=item &basic_search_form() |
|
|
|
Returns a scalar which holds html for the basic search form. |
|
|
|
=cut |
|
|
|
###################################################################### |
|
###################################################################### |
|
|
|
sub basic_search_form{ |
|
my ($closebutton,$hidden) = @_; |
|
my $scrout=<<"ENDDOCUMENT"; |
|
<html> |
|
<head> |
|
<title>The LearningOnline Network with CAPA</title> |
|
<script type="text/javascript"> |
|
function openhelp(val) { |
|
openhelpwin=open('/adm/help/searchcat.html','helpscreen', |
|
'scrollbars=1,width=600,height=300'); |
|
openhelpwin.focus(); |
} |
} |
|
</script> |
|
</head> |
|
<body bgcolor="#FFFFFF"> |
|
<img align='right' src='/adm/lonIcons/lonlogos.gif' /> |
|
<h1>Search Catalog</h1> |
|
<form method="post" action="/adm/searchcat"> |
|
$hidden |
|
<h3>Basic Search</h3> |
|
<p> |
|
Enter terms or phrases separated by AND, OR, or NOT then press SEARCH below. |
|
</p> |
|
<p> |
|
<table> |
|
<tr><td> |
|
ENDDOCUMENT |
|
$scrout.=' '.&simpletextfield('basicexp',$ENV{'form.basicexp'},40). |
|
' '; |
|
# $scrout.=&simplecheckbox('allversions',$ENV{'form.allversions'}); |
|
# $scrout.='<font color="#800000">Search historic archives</font>'; |
|
$scrout.=<<ENDDOCUMENT; |
|
</td><td><a href="/adm/searchcat?reqinterface=advanced">Advanced Search</a></td></tr></table> |
|
</p> |
|
<p> |
|
<input type="submit" name="basicsubmit" value='SEARCH' /> |
|
$closebutton |
|
<!-- basic view selection --> |
|
<select name='basicviewselect'> |
|
<option value='Detailed Citation View' selected="true"> |
|
Detailed Citation View</option> |
|
<option value='Summary View'>Summary View</option> |
|
<option value='Fielded Format'>Fielded Format</option> |
|
<option value='XML/SGML'>XML/SGML</option> |
|
</select> |
|
<!-- end of basic view selection --> |
|
<input type="button" value="HELP" onClick="openhelp()" /> |
|
</p> |
|
</form> |
|
</body> |
|
</html> |
|
ENDDOCUMENT |
|
return $scrout; |
|
} |
|
###################################################################### |
|
###################################################################### |
|
|
|
=pod |
|
|
|
=item &advanced_search_form() |
|
|
|
Returns a scalar which holds html for the advanced search form. |
|
|
# ----------------------------- Else, begin building search interface to output |
=cut |
$scrout=''; # building a part of screen output |
|
|
###################################################################### |
|
###################################################################### |
|
|
|
sub advanced_search_form{ |
|
my ($closebutton,$hidden) = @_; |
|
my $scrout=<<"ENDHEADER"; |
|
<html> |
|
<head> |
|
<title>The LearningOnline Network with CAPA</title> |
|
<script type="text/javascript"> |
|
function openhelp(val) { |
|
openhelpwin=open('/adm/help/searchcat.html','helpscreen', |
|
'scrollbars=1,width=600,height=300'); |
|
openhelpwin.focus(); |
|
} |
|
</script> |
|
</head> |
|
<body bgcolor="#FFFFFF"> |
|
<img align='right' src='/adm/lonIcons/lonlogos.gif' /> |
|
<h1>Search Catalog</h1> |
|
<form method="post" action="/adm/searchcat"> |
|
$hidden |
|
<hr /> |
|
<h3>Advanced Search</h3> |
|
ENDHEADER |
$scrout.=&searchphrasefield('Limit by title','title', |
$scrout.=&searchphrasefield('Limit by title','title', |
$ENV{'form.title'}); |
$ENV{'form.title'}); |
|
|
$scrout.=&searchphrasefield('Limit by author','author', |
$scrout.=&searchphrasefield('Limit by author','author', |
$ENV{'form.author'}); |
$ENV{'form.author'}); |
|
|
$scrout.=&searchphrasefield('Limit by subject','subject', |
$scrout.=&searchphrasefield('Limit by subject','subject', |
$ENV{'form.subject'}); |
$ENV{'form.subject'}); |
|
|
$scrout.=&searchphrasefield('Limit by keywords','keywords', |
$scrout.=&searchphrasefield('Limit by keywords','keywords', |
$ENV{'form.keywords'}); |
$ENV{'form.keywords'}); |
|
|
$scrout.=&searchphrasefield('Limit by URL','url', |
$scrout.=&searchphrasefield('Limit by URL','url', |
$ENV{'form.url'}); |
$ENV{'form.url'}); |
|
|
# $scrout.=&searchphrasefield('Limit by version','version', |
# $scrout.=&searchphrasefield('Limit by version','version', |
# $ENV{'form.version'}); |
# $ENV{'form.version'}); |
|
|
$scrout.=&searchphrasefield('Limit by notes','notes', |
$scrout.=&searchphrasefield('Limit by notes','notes', |
$ENV{'form.notes'}); |
$ENV{'form.notes'}); |
|
|
$scrout.=&searchphrasefield('Limit by abstract','abstract', |
$scrout.=&searchphrasefield('Limit by abstract','abstract', |
$ENV{'form.abstract'}); |
$ENV{'form.abstract'}); |
|
|
$ENV{'form.mime'}='any' unless length($ENV{'form.mime'}); |
$ENV{'form.mime'}='any' unless length($ENV{'form.mime'}); |
$scrout.=&selectbox('Limit by MIME type','mime', |
$scrout.=&selectbox('Limit by MIME type','mime', |
$ENV{'form.mime'}, |
$ENV{'form.mime'}, |
'any','Any type', |
'any','Any type', |
\&{Apache::loncommon::filedescriptionex}, |
\&{Apache::loncommon::filedescriptionex}, |
(&Apache::loncommon::fileextensions)); |
(&Apache::loncommon::fileextensions)); |
|
|
$ENV{'form.language'}='any' unless length($ENV{'form.language'}); |
$ENV{'form.language'}='any' unless length($ENV{'form.language'}); |
|
|
$scrout.=&selectbox('Limit by language','language', |
$scrout.=&selectbox('Limit by language','language', |
$ENV{'form.language'},'any','Any Language', |
$ENV{'form.language'},'any','Any Language', |
\&{Apache::loncommon::languagedescription}, |
\&{Apache::loncommon::languagedescription}, |
(&Apache::loncommon::languageids), |
(&Apache::loncommon::languageids), |
); |
); |
|
|
# ------------------------------------------------ Compute date selection boxes |
# ------------------------------------------------ Compute date selection boxes |
$scrout.=<<CREATIONDATESTART; |
$scrout.=<<CREATIONDATESTART; |
<p> |
<p> |
Line 355 CREATIONDATESTART
|
Line 428 CREATIONDATESTART
|
$ENV{'form.creationdatestart_day'}, |
$ENV{'form.creationdatestart_day'}, |
$ENV{'form.creationdatestart_year'}, |
$ENV{'form.creationdatestart_year'}, |
); |
); |
$scrout.=<<CREATIONDATEEND; |
$scrout.="and:\n"; |
and: |
|
CREATIONDATEEND |
|
$scrout.=&dateboxes('creationdateend',12,31,2051, |
$scrout.=&dateboxes('creationdateend',12,31,2051, |
$ENV{'form.creationdateend_month'}, |
$ENV{'form.creationdateend_month'}, |
$ENV{'form.creationdateend_day'}, |
$ENV{'form.creationdateend_day'}, |
$ENV{'form.creationdateend_year'}, |
$ENV{'form.creationdateend_year'}, |
); |
); |
$scrout.="</p>"; |
$scrout.="</p>"; |
|
|
$scrout.=<<LASTREVISIONDATESTART; |
$scrout.=<<LASTREVISIONDATESTART; |
<p> |
<p> |
<font color="#800000" face="helvetica"><b>LIMIT BY LAST REVISION DATE RANGE: |
<font color="#800000" face="helvetica"><b>LIMIT BY LAST REVISION DATE RANGE: |
Line 385 LASTREVISIONDATEEND
|
Line 455 LASTREVISIONDATEEND
|
$ENV{'form.lastrevisiondateend_year'}, |
$ENV{'form.lastrevisiondateend_year'}, |
); |
); |
$scrout.='</p>'; |
$scrout.='</p>'; |
|
|
$scrout.=&searchphrasefield('Limit by publisher/owner','owner', |
$scrout.=&searchphrasefield('Limit by publisher/owner','owner', |
$ENV{'form.owner'}); |
$ENV{'form.owner'}); |
|
|
$ENV{'form.copyright'}='any' unless length($ENV{'form.copyright'}); |
$ENV{'form.copyright'}='any' unless length($ENV{'form.copyright'}); |
$scrout.=&selectbox('Limit by copyright/distribution','copyright', |
$scrout.=&selectbox('Limit by copyright/distribution','copyright', |
$ENV{'form.copyright'}, |
$ENV{'form.copyright'}, |
Line 396 LASTREVISIONDATEEND
|
Line 464 LASTREVISIONDATEEND
|
\&{Apache::loncommon::copyrightdescription}, |
\&{Apache::loncommon::copyrightdescription}, |
(&Apache::loncommon::copyrightids), |
(&Apache::loncommon::copyrightids), |
); |
); |
|
|
# ------------------------------------------- Compute customized metadata field |
# ------------------------------------------- Compute customized metadata field |
$scrout.=<<CUSTOMMETADATA; |
$scrout.=<<CUSTOMMETADATA; |
<p> |
<p> |
Line 407 For resource-specific metadata, enter in
|
Line 474 For resource-specific metadata, enter in
|
<b>Example:</b> grandmother=75 OR grandfather=85 |
<b>Example:</b> grandmother=75 OR grandfather=85 |
<br /> |
<br /> |
CUSTOMMETADATA |
CUSTOMMETADATA |
$scrout.=&simpletextfield('custommetadata',$ENV{'form.custommetadata'}); |
$scrout.=&simpletextfield('custommetadata',$ENV{'form.custommetadata'}); |
$scrout.=' <i>initial users of this system do not need to worry about this option</i>'; |
|
|
|
$scrout.=<<CUSTOMSHOW; |
$scrout.=<<CUSTOMSHOW; |
<p> |
<p> |
<font color="#800000" face="helvetica"><b>SHOW SPECIAL METADATA FIELDS:</b> |
<font color="#800000" face="helvetica"><b>SHOW SPECIAL METADATA FIELDS:</b> |
Line 418 Enter in a space-separated list of speci
|
Line 483 Enter in a space-separated list of speci
|
in a fielded listing for each record result. |
in a fielded listing for each record result. |
<br /> |
<br /> |
CUSTOMSHOW |
CUSTOMSHOW |
$scrout.=&simpletextfield('customshow',$ENV{'form.customshow'}); |
$scrout.=&simpletextfield('customshow',$ENV{'form.customshow'}); |
$scrout.=' <i>initial users of this system do not need to worry about this option</i>'; |
$scrout.=<<ENDDOCUMENT; |
|
|
# ---------------------------------------------------------------- Print screen |
|
$r->print(<<ENDDOCUMENT); |
|
<html> |
|
<head> |
|
<title>The LearningOnline Network with CAPA</title> |
|
<script type="text/javascript"> |
|
function openhelp(val) { |
|
openhelpwin=open('/adm/help/searchcat.html','helpscreen', |
|
'scrollbars=1,width=600,height=300'); |
|
openhelpwin.focus(); |
|
} |
|
</script> |
|
</head> |
|
<body bgcolor="#FFFFFF"> |
|
<img align='right' src='/adm/lonIcons/lonlogos.gif' /> |
|
<h1>Search Catalog</h1> |
|
<form method="post" action="/adm/searchcat"> |
|
$hidden |
|
<hr /> |
|
<h3>Basic Search</h3> |
|
<p> |
|
Enter terms or phrases separated by search operators |
|
such as AND, OR, or NOT then press SEARCH below. Terms should be specific |
|
to the title, author, subject, notes, or abstract information associated |
|
with a resource. |
|
<br /> |
|
ENDDOCUMENT |
|
$r->print(&simpletextfield('basicexp',$ENV{'form.basicexp'})); |
|
$r->print(' '); |
|
$r->print(&simplecheckbox('titleonly',$ENV{'form.titleonly'})); |
|
$r->print('<font color="#800000">Title only</font> '); |
|
# $r->print(&simplecheckbox('allversions',$ENV{'form.allversions'})); |
|
# <font color="#800000">Search historic archives</font> |
|
$r->print(<<ENDDOCUMENT); |
|
<br /> |
|
<input type="submit" name="basicsubmit" value='SEARCH' /> |
|
<input type="reset" name="reset" value='RESET' /> |
|
$closebutton |
|
$basicviewselect |
|
<input type="button" value="HELP" onClick="openhelp()" /> |
|
</p> |
|
<hr /> |
|
<h3>Advanced Search</h3> |
|
$scrout |
|
<p> |
<p> |
<input type="submit" name="advancedsubmit" value='SEARCH' /> |
<input type="submit" name="advancedsubmit" value='SEARCH' /> |
<input type="reset" name="reset" value='RESET' /> |
<input type="reset" name="reset" value='RESET' /> |
$closebutton |
$closebutton |
$advancedviewselect |
<!-- advance view select --> |
|
<select name='advancedviewselect'> |
|
<option value='Detailed Citation View' selected="true"> |
|
Detailed Citation View</option> |
|
<option value='Summary View'>Summary View</option> |
|
<option value='Fielded Format'>Fielded Format</option> |
|
<option value='XML/SGML'>XML/SGML</option> |
|
</select> |
|
<!-- end of advanced view select --> |
<input type="button" value="HELP" onClick="openhelp()" /> |
<input type="button" value="HELP" onClick="openhelp()" /> |
</p> |
</p> |
</form> |
</form> |
</body> |
</body> |
</html> |
</html> |
ENDDOCUMENT |
ENDDOCUMENT |
return OK; |
return $scrout; |
} |
} |
|
|
###################################################################### |
###################################################################### |
###################################################################### |
###################################################################### |
Line 488 ENDDOCUMENT
|
Line 516 ENDDOCUMENT
|
|
|
Returns a scalar which holds the current ENV{'form.*'} values in |
Returns a scalar which holds the current ENV{'form.*'} values in |
a 'hidden' html input tag. |
a 'hidden' html input tag. |
|
|
=cut |
=cut |
|
|
###################################################################### |
###################################################################### |
###################################################################### |
###################################################################### |
|
|
# ------------------------------------------------------------- make persistent |
|
|
|
sub make_persistent { |
sub make_persistent { |
my $persistent=''; |
my $persistent=''; |
|
|
Line 512 END
|
Line 539 END
|
return $persistent; |
return $persistent; |
} |
} |
|
|
# --------------------------------------------------------- Various form fields |
|
|
###################################################################### |
|
###################################################################### |
|
|
|
=pod |
|
|
|
=item HTML form building functions |
|
|
|
=over 4 |
|
|
|
=item &simpletextfield() |
|
|
|
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. |
|
|
|
=item &simplecheckbox() |
|
|
|
Inputs: $name,$value |
|
|
|
Returns a simple check box with the given $name. |
|
If $value eq 'on' the box is checked. |
|
|
|
=item &searchphrasefield() |
|
|
|
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. |
|
|
|
=item &dateboxes() |
|
|
|
=item &selectbox() |
|
|
|
=back |
|
|
|
=cut |
|
|
|
###################################################################### |
|
###################################################################### |
|
|
sub simpletextfield { |
sub simpletextfield { |
my ($name,$value)=@_; |
my ($name,$value,$size)=@_; |
return '<input type=text name=\''.$name. |
$size = 20 if (! defined($size)); |
'\' size=20 value=\''.$value.'\' />'; |
return '<input type="text" name="'.$name. |
|
'" size="'.$size.'" value="'.$value.'" />'; |
} |
} |
|
|
sub simplecheckbox { |
sub simplecheckbox { |
my ($name,$value)=@_; |
my ($name,$value)=@_; |
my $checked=''; |
my $checked=''; |
$checked="CHECKED" if $value eq 'on'; |
$checked="CHECKED" if $value eq 'on'; |
return '<input type=checkbox name=\''.$name.'\' '. $checked . '>'; |
return '<input type="checkbox" name="'.$name.'" '. $checked . ' />'; |
} |
} |
|
|
sub searchphrasefield { |
sub searchphrasefield { |
my ($title,$name,$value)=@_; |
my ($title,$name,$value)=@_; |
my $instruction=<<END; |
my $instruction=<<END; |
Enter terms or phrases separated by search operators such |
Enter terms or phrases separated by search operators such as AND, OR, or NOT. |
as AND, OR, or NOT. |
|
END |
END |
my $uctitle=uc($title); |
my $uctitle=uc($title); |
return "\n<p><font color=\"#800000\" face=\"helvetica\"><b>$uctitle:</b>". |
return "\n". |
"</FONT> $instruction<br />". |
'<p><font color="#800000" face="helvetica"><b>'.$uctitle.':</b>'. |
'<input type=text name="'.$name.'" size=80 value=\''.$value.'\'>'; |
"</FONT> $instruction<br />".&simpletextfield($name,$value,80); |
} |
} |
|
|
sub dateboxes { |
sub dateboxes { |
Line 586 END
|
Line 655 END
|
sub selectbox { |
sub selectbox { |
my ($title,$name,$value,$anyvalue,$anytag,$functionref,@idlist)=@_; |
my ($title,$name,$value,$anyvalue,$anytag,$functionref,@idlist)=@_; |
my $uctitle=uc($title); |
my $uctitle=uc($title); |
my $selout="\n<p><font color=\"#800000\" face=\"helvetica\"><b>$uctitle:". |
my $selout="\n".'<p><font color="#800000" face="helvetica">'. |
"</b></font><br />".'<select name="'.$name.'">'; |
'<b>'.$uctitle.':</b></font><br /><select name="'.$name.'">'; |
foreach ($anyvalue,@idlist) { |
foreach ($anyvalue,@idlist) { |
$selout.='<option value=\''.$_.'\''; |
$selout.='<option value="'.$_.'"'; |
if ($_ eq $value and !/^any$/) { |
if ($_ eq $value and !/^any$/) { |
$selout.=' selected>'.&{$functionref}($_).'</option>'; |
$selout.=' selected >'.&{$functionref}($_).'</option>'; |
} |
} |
elsif ($_ eq $value and /^$anyvalue$/) { |
elsif ($_ eq $value and /^$anyvalue$/) { |
$selout.=' selected>'.$anytag.'</option>'; |
$selout.=' selected >'.$anytag.'</option>'; |
} |
} |
else {$selout.='>'.&{$functionref}($_).'</option>';} |
else {$selout.='>'.&{$functionref}($_).'</option>';} |
} |
} |
return $selout.'</select>'; |
return $selout.'</select>'; |
} |
} |
|
|
# ----------------------------------------------- Performing an advanced search |
###################################################################### |
|
###################################################################### |
|
|
|
=pod |
|
|
|
=item &advancedsearch() |
|
|
|
=cut |
|
|
|
###################################################################### |
|
###################################################################### |
sub advancedsearch { |
sub advancedsearch { |
my ($r,$envhash)=@_; |
my ($r,$envhash,$hidden)=@_; |
my %ENV=%{$envhash}; |
my %ENV=%{$envhash}; |
|
|
my $fillflag=0; |
my $fillflag=0; |
# Clean up fields for safety |
# Clean up fields for safety |
for my $field ('title','author','subject','keywords','url','version', |
for my $field ('title','author','subject','keywords','url','version', |
Line 637 sub advancedsearch {
|
Line 715 sub advancedsearch {
|
&output_blank_field_error($r); |
&output_blank_field_error($r); |
return OK; |
return OK; |
} |
} |
|
|
|
|
# Turn the form input into a SQL-based query |
# Turn the form input into a SQL-based query |
my $query=''; |
my $query=''; |
|
|
my @queries; |
my @queries; |
# Evaluate logical expression AND/OR/NOT phrase fields. |
# Evaluate logical expression AND/OR/NOT phrase fields. |
foreach my $field ('title','author','subject','notes','abstract','url', |
foreach my $field ('title','author','subject','notes','abstract','url', |
Line 683 sub advancedsearch {
|
Line 758 sub advancedsearch {
|
elsif ($datequery) { |
elsif ($datequery) { |
push @queries,$datequery; |
push @queries,$datequery; |
} |
} |
|
|
# Process form information for custom metadata querying |
# Process form information for custom metadata querying |
my $customquery=''; |
my $customquery=''; |
if ($ENV{'form.custommetadata'}) { |
if ($ENV{'form.custommetadata'}) { |
Line 711 sub advancedsearch {
|
Line 785 sub advancedsearch {
|
$reply=&Apache::lonnet::metadata_query($query, |
$reply=&Apache::lonnet::metadata_query($query, |
$customquery,$customshow); |
$customquery,$customshow); |
} |
} |
&output_results('Advanced',$r,$envhash,$customquery,$reply); |
&output_results('Advanced',$r,$envhash,$customquery,$reply,$hidden); |
} |
} |
elsif ($customquery) { |
elsif ($customquery) { |
my $reply; # reply hash reference |
my $reply; # reply hash reference |
$reply=&Apache::lonnet::metadata_query('', |
$reply=&Apache::lonnet::metadata_query('', |
$customquery,$customshow); |
$customquery,$customshow); |
&output_results('Advanced',$r,$envhash,$customquery,$reply); |
&output_results('Advanced',$r,$envhash,$customquery,$reply,$hidden); |
} |
} |
# should not get to this point |
# should not get to this point |
return 'Error. Should not have gone to this point.'; |
return 'Error. Should not have gone to this point.'; |
} |
} |
|
|
# --------------------------------------------------- Performing a basic search |
###################################################################### |
|
###################################################################### |
|
|
|
=pod |
|
|
|
=item &basicsearch() |
|
|
|
=cut |
|
|
|
###################################################################### |
|
###################################################################### |
sub basicsearch { |
sub basicsearch { |
my ($r,$envhash)=@_; |
my ($r,$envhash,$hidden)=@_; |
my %ENV=%{$envhash}; |
my %ENV=%{$envhash}; |
# Clean up fields for safety |
# Clean up fields for safety |
for my $field ('basicexp') { |
for my $field ('basicexp') { |
Line 747 sub basicsearch {
|
Line 831 sub basicsearch {
|
# Build SQL query string based on form page |
# Build SQL query string based on form page |
my $query=''; |
my $query=''; |
my $concatarg=join('," ",', |
my $concatarg=join('," ",', |
('title', 'author', 'subject', 'notes', 'abstract')); |
('title', 'author', 'subject', 'notes', 'abstract', |
|
'keywords')); |
$concatarg='title' if $ENV{'form.titleonly'}; |
$concatarg='title' if $ENV{'form.titleonly'}; |
|
|
$query=&build_SQL_query('concat('.$concatarg.')',$ENV{'form.'.'basicexp'}); |
$query=&build_SQL_query('concat('.$concatarg.')',$ENV{'form.'.'basicexp'}); |
Line 757 sub basicsearch {
|
Line 842 sub basicsearch {
|
|
|
# Output search results |
# Output search results |
|
|
&output_results('Basic',$r,$envhash,$query,$reply); |
&output_results('Basic',$r,$envhash,$query,$reply,$hidden); |
|
|
return OK; |
return OK; |
} |
} |
|
|
# ------------------------------------------------------------- build_SQL_query |
|
|
###################################################################### |
|
###################################################################### |
|
|
|
=pod |
|
|
|
=item &build_SQL_query() |
|
|
|
=cut |
|
|
|
###################################################################### |
|
###################################################################### |
sub build_SQL_query { |
sub build_SQL_query { |
my ($field_name,$logic_statement)=@_; |
my ($field_name,$logic_statement)=@_; |
my $q=new Text::Query('abc', |
my $q=new Text::Query('abc', |
Line 774 sub build_SQL_query {
|
Line 870 sub build_SQL_query {
|
return $sql_query; |
return $sql_query; |
} |
} |
|
|
# ------------------------------------------------- build custom metadata query |
###################################################################### |
|
###################################################################### |
|
|
|
=pod |
|
|
|
=item &build_custommetadata_query() |
|
|
|
=cut |
|
|
|
###################################################################### |
|
###################################################################### |
sub build_custommetadata_query { |
sub build_custommetadata_query { |
my ($field_name,$logic_statement)=@_; |
my ($field_name,$logic_statement)=@_; |
|
&Apache::lonnet::logthis("Entered build_custommetadata_query:". |
|
$field_name.':'.$logic_statement); |
my $q=new Text::Query('abc', |
my $q=new Text::Query('abc', |
-parse => 'Text::Query::ParseAdvanced', |
-parse => 'Text::Query::ParseAdvanced', |
-build => 'Text::Query::BuildAdvancedString'); |
-build => 'Text::Query::BuildAdvancedString'); |
Line 784 sub build_custommetadata_query {
|
Line 892 sub build_custommetadata_query {
|
my $matchexp=${$q}{'-parse'}{'-build'}{'matchstring'}; |
my $matchexp=${$q}{'-parse'}{'-build'}{'matchstring'}; |
# quick fix to change literal into xml tag-matching |
# quick fix to change literal into xml tag-matching |
# will eventually have to write a separate builder module |
# will eventually have to write a separate builder module |
my $oldmatchexp=$matchexp; |
# wordone=wordtwo becomes\<wordone\>[^\<] *wordtwo[^\<]*\<\/wordone\> |
$matchexp=~s/(\w+)\\=([\w\\\+]+)/\\<$1\\>\[\^\\<\]\*$2\[\^\\<\]\*\\<\\\/$1\\>/g; |
$matchexp =~ s/(\w+)\\=([\w\\\+]+)?# wordone=wordtwo is changed to |
|
/\\<$1\\>?# \<wordone\> |
|
\[\^\\<\]?# [^\<] |
|
\*$2\[\^\\<\]?# *wordtwo[^\<] |
|
\*\\<\\\/$1\\>?# *\<\/wordone\> |
|
/g; |
|
&Apache::lonnet::logthis("match expression: ".$matchexp); |
return $matchexp; |
return $matchexp; |
} |
} |
|
|
# - Recursively parse a reverse notation expression into a SQL query expression |
###################################################################### |
|
###################################################################### |
|
|
|
=pod |
|
|
|
=item &recursive_SQL_query_build() |
|
|
|
=cut |
|
|
|
###################################################################### |
|
###################################################################### |
sub recursive_SQL_query_build { |
sub recursive_SQL_query_build { |
my ($dkey,$pattern)=@_; |
my ($dkey,$pattern)=@_; |
my @matches=($pattern=~/(\[[^\]|\[]*\])/g); |
my @matches=($pattern=~/(\[[^\]|\[]*\])/g); |
Line 823 sub recursive_SQL_query_build {
|
Line 947 sub recursive_SQL_query_build {
|
&recursive_SQL_query_build($dkey,$pattern); |
&recursive_SQL_query_build($dkey,$pattern); |
} |
} |
|
|
# ------------------------------------------------------------ Build date query |
###################################################################### |
|
###################################################################### |
|
|
|
=pod |
|
|
|
=item &build_date_queries() |
|
|
|
=cut |
|
|
|
###################################################################### |
|
###################################################################### |
sub build_date_queries { |
sub build_date_queries { |
my ($cmonth1,$cday1,$cyear1,$cmonth2,$cday2,$cyear2, |
my ($cmonth1,$cday1,$cyear1,$cmonth2,$cday2,$cyear2, |
$lmonth1,$lday1,$lyear1,$lmonth2,$lday2,$lyear2)=@_; |
$lmonth1,$lday1,$lyear1,$lmonth2,$lday2,$lyear2)=@_; |
Line 872 sub build_date_queries {
|
Line 1006 sub build_date_queries {
|
return ''; |
return ''; |
} |
} |
|
|
# ----------------------------- 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 |
=pod |
# contacted, etc.) |
|
|
=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 { |
sub output_results { |
my $fnum; # search result counter |
my $fnum; # search result counter |
my ($mode,$r,$envhash,$query,$replyref)=@_; |
my ($mode,$r,$envhash,$query,$replyref,$hidden)=@_; |
my %ENV=%{$envhash}; |
my %ENV=%{$envhash}; |
my %rhash=%{$replyref}; |
my %rhash=%{$replyref}; |
my $compiledresult=''; |
my $compiledresult=''; |
Line 1217 ENDPOP
|
Line 1363 ENDPOP
|
my ($title,$author,$subject,$url,$keywords,$version, |
my ($title,$author,$subject,$url,$keywords,$version, |
$notes,$abstract,$mime,$lang, |
$notes,$abstract,$mime,$lang, |
$creationdate,$lastrevisiondate,$owner,$copyright)=@fields; |
$creationdate,$lastrevisiondate,$owner,$copyright)=@fields; |
|
unless ($title =~ /^\s*$/ ) { $title='<i>Untitled</i>'; } |
unless ($title) { $title='<i>Untitled</i>'; } |
|
unless ($ENV{'user.adv'}) { |
unless ($ENV{'user.adv'}) { |
$keywords='<i>- not displayed -</i>'; |
$keywords='<i>- not displayed -</i>'; |
$fields[4]=$keywords; |
$fields[4]=$keywords; |
Line 1336 RESULTS
|
Line 1481 RESULTS
|
RESULTS |
RESULTS |
} |
} |
|
|
# ------------------------------------------------------ Detailed Citation View |
###################################################################### |
|
###################################################################### |
|
|
|
=pod |
|
|
|
=item Metadata Viewing Functions |
|
|
|
Output is a HTML-ified string. |
|
Input arguments are title, author, subject, url, keywords, version, |
|
notes, short abstract, mime, language, creation date, |
|
last revision date, owner, copyright, hostname, httphost, and |
|
extra custom metadata to show. |
|
|
|
=over 4 |
|
|
|
=item &detailed_citation_view() |
|
|
|
=cut |
|
|
|
###################################################################### |
|
###################################################################### |
sub detailed_citation_view { |
sub detailed_citation_view { |
my ($title,$author,$subject,$url,$keywords,$version, |
my ($title,$author,$subject,$url,$keywords,$version, |
$notes,$shortabstract,$mime,$lang, |
$notes,$shortabstract,$mime,$lang, |
Line 1375 END
|
Line 1540 END
|
return $result; |
return $result; |
} |
} |
|
|
# ---------------------------------------------------------------- Summary View |
###################################################################### |
|
###################################################################### |
|
|
|
=pod |
|
|
|
=item &summary_view() |
|
|
|
=cut |
|
|
|
###################################################################### |
|
###################################################################### |
sub summary_view { |
sub summary_view { |
my ($title,$author,$subject,$url,$keywords,$version, |
my ($title,$author,$subject,$url,$keywords,$version, |
$notes,$shortabstract,$mime,$lang, |
$notes,$shortabstract,$mime,$lang, |
Line 1393 END
|
Line 1568 END
|
return $result; |
return $result; |
} |
} |
|
|
# -------------------------------------------------------------- Fielded Format |
###################################################################### |
|
###################################################################### |
|
|
|
=pod |
|
|
|
=item &fielded_format_view() |
|
|
|
=cut |
|
|
|
###################################################################### |
|
###################################################################### |
sub fielded_format_view { |
sub fielded_format_view { |
my ($title,$author,$subject,$url,$keywords,$version, |
my ($title,$author,$subject,$url,$keywords,$version, |
$notes,$shortabstract,$mime,$lang, |
$notes,$shortabstract,$mime,$lang, |
Line 1424 END
|
Line 1609 END
|
return $result; |
return $result; |
} |
} |
|
|
# -------------------------------------------------------------------- XML/SGML |
###################################################################### |
|
###################################################################### |
|
|
|
=pod |
|
|
|
=item &xml_sgml_view() |
|
|
|
=back |
|
|
|
=cut |
|
|
|
###################################################################### |
|
###################################################################### |
sub xml_sgml_view { |
sub xml_sgml_view { |
my ($title,$author,$subject,$url,$keywords,$version, |
my ($title,$author,$subject,$url,$keywords,$version, |
$notes,$shortabstract,$mime,$lang, |
$notes,$shortabstract,$mime,$lang, |
Line 1466 END
|
Line 1663 END
|
return $result; |
return $result; |
} |
} |
|
|
# ---------------------------------------------------- see if a field is filled |
###################################################################### |
|
###################################################################### |
|
|
|
=pod |
|
|
|
=item &filled() see if field is filled. |
|
|
|
=cut |
|
|
|
###################################################################### |
|
###################################################################### |
sub filled { |
sub filled { |
my ($field)=@_; |
my ($field)=@_; |
if ($field=~/\S/ && $field ne 'any') { |
if ($field=~/\S/ && $field ne 'any') { |
Line 1477 sub filled {
|
Line 1684 sub filled {
|
} |
} |
} |
} |
|
|
# ---------------- Message to output when there are not enough fields filled in |
###################################################################### |
|
###################################################################### |
|
|
|
=pod |
|
|
|
=item &output_blank_field_error() |
|
|
|
=cut |
|
|
|
###################################################################### |
|
###################################################################### |
sub output_blank_field_error { |
sub output_blank_field_error { |
my ($r)=@_; |
my ($r)=@_; |
# make query information persistent to allow for subsequent revision |
# make query information persistent to allow for subsequent revision |
Line 1511 processed.
|
Line 1728 processed.
|
RESULTS |
RESULTS |
} |
} |
|
|
# ----------------------------------------------------------- Output date error |
###################################################################### |
|
###################################################################### |
|
|
|
=pod |
|
|
|
=item &output_date_error() |
|
|
|
Output a full html page with an error message. |
|
|
|
=cut |
|
|
|
###################################################################### |
|
###################################################################### |
sub output_date_error { |
sub output_date_error { |
my ($r,$message)=@_; |
my ($r,$message)=@_; |
# make query information persistent to allow for subsequent revision |
# make query information persistent to allow for subsequent revision |
my $persistent=&make_persistent(); |
my $persistent=&make_persistent(); |
|
|
$r->print(<<BEGINNING); |
$r->print(<<RESULTS); |
<html> |
<html> |
<head> |
<head> |
<title>The LearningOnline Network with CAPA</title> |
<title>The LearningOnline Network with CAPA</title> |
BEGINNING |
|
$r->print(<<RESULTS); |
|
</head> |
</head> |
<body bgcolor="#ffffff"> |
<body bgcolor="#ffffff"> |
<img align='right' src='/adm/lonIcons/lonlogos.gif' /> |
<img align='right' src='/adm/lonIcons/lonlogos.gif' /> |
Line 1542 $message
|
Line 1769 $message
|
RESULTS |
RESULTS |
} |
} |
|
|
# --------- settings whenever the user causes the search window to be launched |
###################################################################### |
|
###################################################################### |
|
|
|
=pod |
|
|
|
=item &start_fresh_session() |
|
|
|
Cleans the global %hash by removing all fields which begin with |
|
'pre_' or 'store'. |
|
|
|
=cut |
|
|
|
###################################################################### |
|
###################################################################### |
sub start_fresh_session { |
sub start_fresh_session { |
delete $hash{'mode_catalog'}; |
delete $hash{'mode_catalog'}; |
foreach (keys %hash) { |
foreach (keys %hash) { |
Line 1555 sub start_fresh_session {
|
Line 1795 sub start_fresh_session {
|
} |
} |
} |
} |
|
|
# ----------------------------------------------- send javascript to popwin |
###################################################################### |
|
###################################################################### |
|
|
|
=pod |
|
|
|
=item &popwin_js() send javascript to popwin |
|
|
|
=cut |
|
|
|
###################################################################### |
|
###################################################################### |
sub popwin_js { |
sub popwin_js { |
# Print javascript out to popwin, but make sure we dont generate |
# Print javascript out to popwin, but make sure we dont generate |
# any javascript errors in doing so. |
# any javascript errors in doing so. |
Line 1570 END
|
Line 1820 END
|
$r->rflush(); |
$r->rflush(); |
} |
} |
|
|
|
###################################################################### |
|
###################################################################### |
|
|
|
=pod |
|
|
|
=item &popwin_imgupdate() |
|
|
|
=cut |
|
|
|
###################################################################### |
|
###################################################################### |
sub popwin_imgupdate { |
sub popwin_imgupdate { |
my ($r,$imgnum,$icon) = @_; |
my ($r,$imgnum,$icon) = @_; |
&popwin_js($r,'popwin.document.img'.$imgnum.'.'. |
&popwin_js($r,'popwin.document.img'.$imgnum.'.'. |
Line 1774 more fields need to be filled in
|
Line 2035 more fields need to be filled in
|
|
|
=item * |
=item * |
|
|
output_date_error(server reference, error message) : outputs |
output_date_error(server reference, error message) : |
an error message specific to bad date format. |
|
|
|
=back |
=back |
|
|