--- loncom/interface/lonsearchcat.pm 2001/03/08 16:54:20 1.4 +++ loncom/interface/lonsearchcat.pm 2001/03/15 13:23:15 1.11 @@ -7,6 +7,9 @@ package Apache::lonsearchcat; use strict; use Apache::Constants qw(:common); +use Apache::lonnet(); +use Apache::File(); +use CGI qw(:standard); my %language; my $scrout; @@ -16,15 +19,32 @@ my %mimetag; sub handler { my $r = shift; + +# -------------------------------------- see if called from an interactive mode + map { + my ($name, $value) = split(/=/,$_); + $value =~ tr/+/ /; + $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg; + if ($name eq 'catalogmode') { + $ENV{'form.'.$name}=$value; + } + } (split(/&/,$ENV{'QUERY_STRING'})); + $r->content_type('text/html'); $r->send_http_header; return OK if $r->header_only; %metadatafields=(); + my $hidden=''; + $hidden=< +END + # ------------------------------------------------ First, check out environment $metadatafields{'owner'}=$ENV{'user.name'}.'@'.$ENV{'user.domain'}; +# --------------------------------- Compute various listings of metadata values %language=(); $language{'any'}='Any language'; @@ -56,560 +76,96 @@ sub handler { } <$fh>; } - $scrout=""; + if ($ENV{'form.basicsubmit'} eq 'SEARCH') { + return &basicsearch($r,$ENV{'form.basicexp'}); + } + + $scrout=''; # building a part of screen output $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'}='notxxx' unless length($ENV{'form.mime'}); $scrout.=&selectbox('Limit by MIME type','mime', - 'notxxx',%mimetag); + $ENV{'form.mime'},%mimetag); + + $ENV{'form.language'}='any' unless length($ENV{'form.language'}); $scrout.=&selectbox('Limit by language','language', - 'any',%language); + $ENV{'form.language'},%language); - $scrout.=< LIMIT BY CREATION DATE RANGE:
-between: - - -and: - - -

+between: +CREATIONDATESTART + $scrout.=&dateboxes('creationdatestart',1,1,1976, + $ENV{'form.creationdatestart_month'}, + $ENV{'form.creationdatestart_day'}, + $ENV{'form.creationdatestart_year'}, + ); + $scrout.=< LIMIT BY LAST REVISION DATE RANGE: -
between: - - -and: - - -

+
between: +LASTREVISIONDATESTART + $scrout.=&dateboxes('lastrevisiondatestart',1,1,1976, + $ENV{'form.lastrevisiondatestart_month'}, + $ENV{'form.lastrevisiondatestart_day'}, + $ENV{'form.lastrevisiondatestart_year'}, + ); + $scrout.=<print(<The LearningOnline Network with CAPA -

Search Catalog

+

Search Catalog

+$hidden

Basic Search

@@ -629,17 +186,26 @@ such as AND or OR then press SEARCH belo to the title, author, subject, notes, or abstract information associated with a resource.
- - -Title only +ENDDOCUMENT + $r->print(&simpletextfield('basicexp',$ENV{'form.basicexp'})); + $r->print(' '); + $r->print(&simplecheckbox('titleonly',$ENV{'form.titleonly'})); + $r->print('Title only '); + $r->print(&simplecheckbox('allversions',$ENV{'form.allversions'})); + $r->print(<Search historic archives
+ +


Advanced Search

$scrout

+ +

@@ -656,6 +222,18 @@ sub textfield { ''; } +sub simpletextfield { + my ($name,$value)=@_; + return ''; +} + +sub simplecheckbox { + my ($name,$value)=@_; + my $checked=''; + $checked="CHECKED" if $value eq 'on'; + return ''; +} + sub searchphrasefield { my ($title,$name,$value)=@_; my $instruction=<$uctitle:". - ": $instruction
". + " $instruction
". ''; } +sub dateboxes { + my ($name,$defaultmonth,$defaultday,$defaultyear, + $currentmonth,$currentday,$currentyear)=@_; + ($defaultmonth,$defaultday,$defaultyear)=('','',''); + my $month=< + + + + + + + + + + + + + + +END + $month=~s/(\"$currentmonth\")/$1 SELECTED/ if length($currentmonth); + my $day=< + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +END + $day=~s/(\"$currentday\")/$1 SELECTED/ if length($currentday); + my $year=< + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +END + $year=~s/(\"$currentyear\")/$1 SELECTED/ if length($currentyear); + return "$month$day$year"; +} + sub selectbox { my ($title,$name,$value,%options)=@_; my $uctitle=uc($title); @@ -681,5 +403,135 @@ sub selectbox { return $selout.''; } +# --------------------------------------------------- Performing a basic search +sub basicsearch { + my ($r,$expression)=@_; + + my $query=$expression; + $query="select * from metadata where concat(title,\" \",author) like '\%$expression\%'"; + my $reply=&Apache::lonnet::reply("querysend:$query",'msul3'); + + my @results; + + my $replyfile=''; + $reply=~/^([\.\w]+)$/; # must do since 'use strict' checks for tainting + $replyfile=$r->dir_config('lonDaemons').'/tmp/'.$1; + $reply=~/(.*?)\_/; + my $hostname=$1; + + { + while (1) { + last if -e $replyfile; + sleep 1; + } + # QUESTION: how should I handle this error condition.. + # I'm sure there is syntax elsewhere I can use.. + my $fh=Apache::File->new($replyfile) or + ($r->print('file cannot be opened') and return OK); + @results=<$fh>; + } + + my $compiledresult=''; + + foreach my $result (@results) { + my ($title,$author,$subject,$url,$keywords,$version, + $notes,$abstract,$mime,$lang, + $creationdate,$lastrevisiondate,$owner,$copyright + )=map {&Apache::lonnet::unescape($_)} (split(/\,/,$result)); + my $shortabstract=$abstract; + $shortabstract=substr($abstract,0,200) if length($abstract)>200; + $compiledresult.=< +END + $compiledresult.=< + +
+END + $compiledresult.=<URL: $url
+Title: $title
+Author(s): $author
+Subject: $subject
+Keyword(s): $keywords
+Notes: $notes
+Abstract: $shortabstract
+MIME Type: $mimetag{$mime}
+Language: $language{$lang}
+Creation Date: $creationdate
+Last Revision Date: $lastrevisiondate
+Publisher/Owner: $owner
+Copyright/Distribution: $copyright
+Repository Location: $hostname +

+END +} + + unless ($compiledresult) { + $compiledresult="There were no results that matched your query"; + } + + # make query information persistent to allow for subsequent revision + my $persistent=''; + map { + if (/^form\./ && !/submit/) { + my $name=$_; + my $key=$name; + $name=~s/^form\.//; + $persistent.=< +END + } + } (keys %ENV); + + $r->print(< + +The LearningOnline Network with CAPA +BEGINNING + $r->print(< + function select_data(title,url) { + changeTitle(title); + changeURL(url); + } + function changeTitle(val) { + if (opener.inf.document.forms.resinfo.elements.t) { + opener.inf.document.forms.resinfo.elements.t.value=val; + } + } + function changeURL(val) { + if (opener.inf.document.forms.resinfo.elements.u) { + opener.inf.document.forms.resinfo.elements.u.value=val; + } + } + +SCRIPT + $r->print(< + + +

Search Catalog

+
+ + +$persistent +
+

Search Query

+

+Basic search: $expression +

+

Search Results

+$compiledresult + + +RESULTS + + return OK; +} + 1; __END__ 500 Internal Server Error

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator at root@localhost to inform them of the time this error occurred, and the actions you performed just before this error.

More information about this error may be available in the server error log.