--- loncom/interface/lonsearchcat.pm 2001/03/08 16:54:20 1.4
+++ loncom/interface/lonsearchcat.pm 2001/03/15 18:43:30 1.18
@@ -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,112 @@ sub handler {
} <$fh>;
}
- $scrout="";
+ if ($ENV{'form.basicsubmit'} eq 'SEARCH') {
+ return &basicsearch($r,$ENV{'form.basicexp'});
+ }
+ elsif ($ENV{'form.advancedsubmit'} eq 'SEARCH') {
+ return &advancedsearch($r,\%ENV);
+ }
+
+ $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.=<";
- $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.=<';
$scrout.=&searchphrasefield('Limit by publisher/owner','owner',
- $metadatafields{'owner'});
+ $ENV{'form.owner'});
+# $metadatafields{'owner'});
+ $ENV{'form.copyright'}='any' unless length($ENV{'form.copyright'});
$scrout.=&selectbox('Limit by copyright/distribution','copyright',
- 'any',%cprtag);
+ $ENV{'form.copyright'},%cprtag);
+
+# ------------------------------------------- Compute customized metadata field
+ $scrout.=<
+LIMIT BY OTHER METADATA FIELDS:
+
+For author-specific metadata, enter in an expression in the form of
+key=value separated by operators such as AND or OR.
+Example: grandmother=75 OR grandfather=85
+
+CUSTOMMETADATA
+$scrout.=&simpletextfield('custommetadata',$ENV{'form.custommetadata'});
+$scrout.=' initial users of this system do not need to worry about this option';
# ---------------------------------------------------------------- Print screen
$r->print(<The LearningOnline Network with CAPA
-
Search Catalog
+
Search Catalog
@@ -656,6 +238,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 +419,150 @@ sub selectbox {
return $selout.'';
}
+# ------------------------------------------------ Performing a advanced search
+sub advancedsearch {
+ my ($r,$envhash)=@_;
+ my %ENV=%{$envhash};
+
+}
+
+# --------------------------------------------------- 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::metadata_query($query);
+ &output_results($reply);
+ return OK;
+}
+
+# ----------------------------- format and output results based on a reply list
+sub output_results {
+ my (@replylist)=@_;
+ foreach my $reply (@replylist) {
+
+ 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(<
+SCRIPT
+ $r->print(<
+
+
+