--- loncom/interface/lonsearchcat.pm 2004/07/19 16:38:07 1.231 +++ loncom/interface/lonsearchcat.pm 2006/02/05 20:56:57 1.251 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Search Catalog # -# $Id: lonsearchcat.pm,v 1.231 2004/07/19 16:38:07 raeburn Exp $ +# $Id: lonsearchcat.pm,v 1.251 2006/02/05 20:56:57 www Exp $ # # Copyright Michigan State University Board of Trustees # @@ -63,7 +63,7 @@ package Apache::lonsearchcat; use strict; use Apache::Constants qw(:common :http); -use Apache::lonnet(); +use Apache::lonnet; use Apache::File(); use CGI qw(:standard); use Text::Query; @@ -144,60 +144,62 @@ sub handler { ## printing the results. We only need (theoretically) to do ## this once, so the pause indicator is deleted ## - if (exists($ENV{'form.pause'})) { + if (exists($env{'form.pause'})) { sleep(1); - delete($ENV{'form.pause'}); + delete($env{'form.pause'}); } ## ## Initialize global variables ## my $domain = $r->dir_config('lonDefDomain'); $diropendb= "/home/httpd/perl/tmp/". - "$ENV{'user.domain'}_$ENV{'user.name'}_searchcat.db"; + "$env{'user.domain'}_$env{'user.name'}_searchcat.db"; # # 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.launch'} eq '1')) { - $ENV{'form.persistent_db_id'} = time; + # $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.launch'} eq '1')) { + $env{'form.persistent_db_id'} = time; } $bodytag=&Apache::loncommon::bodytag(undef,undef,undef,1); my $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'; + '_'.&Apache::lonnet::escape($env{'user.name'}). + '_'.$env{'form.persistent_db_id'}.'_persistent_search.db'; ## &Apache::lonhtmlcommon::clear_breadcrumbs(); - if (exists($ENV{'request.course.id'}) && $ENV{'request.course.id'} ne '') { + if (exists($env{'request.course.id'}) && $env{'request.course.id'} ne '') { &Apache::lonhtmlcommon::add_breadcrumb ({href=>'/adm/searchcat?'. - 'catalogmode='.$ENV{'form.catalogmode'}. - '&launch='.$ENV{'form.launch'}. - '&mode='.$ENV{'form.mode'}, + 'catalogmode='.$env{'form.catalogmode'}. + '&launch='.$env{'form.launch'}. + '&mode='.$env{'form.mode'}, text=>"Course and Catalog Search", target=>'_top', bug=>'Searching',}); } else { &Apache::lonhtmlcommon::add_breadcrumb ({href=>'/adm/searchcat?'. - 'catalogmode='.$ENV{'form.catalogmode'}. - '&launch='.$ENV{'form.launch'}. - '&mode='.$ENV{'form.mode'}, + 'catalogmode='.$env{'form.catalogmode'}. + '&launch='.$env{'form.launch'}. + '&mode='.$env{'form.mode'}, text=>"Catalog Search", target=>'_top', bug=>'Searching',}); } # - if ($ENV{'form.phase'} !~ m/(basic|adv|course)_search/) { + if ($env{'form.phase'} !~ m/(basic|adv|course)_search/) { if (! &get_persistent_form_data($persistent_db_file)) { - if ($ENV{'form.phase'} =~ /(run_search|results)/) { + if ($env{'form.phase'} =~ /(run_search|results)/) { &Apache::lonnet::logthis('lonsearchcat:'. 'Unable to recover data from '. $persistent_db_file); - $r->print(< -LON-CAPA Search Error + my $html=&Apache::lonxml::xmlbegin(); + $r->print(< +LON-CAPA Search Error $bodytag We were unable to retrieve data describing your search. This is a serious error and has been logged. Please alert your LON-CAPA administrator. @@ -214,17 +216,18 @@ END ## Clear out old values from groupsearch database ## untie %groupsearch_db if (tied(%groupsearch_db)); - if (($ENV{'form.cleargroupsort'} eq '1') || - (($ENV{'form.launch'} eq '1') && - ($ENV{'form.catalogmode'} eq 'groupsearch'))) { + if (($env{'form.cleargroupsort'} eq '1') || + (($env{'form.launch'} eq '1') && + ($env{'form.catalogmode'} eq 'groupsearch'))) { if (tie(%groupsearch_db,'GDBM_File',$diropendb,&GDBM_WRCREAT(),0640)) { &start_fresh_session(); untie %groupsearch_db; - delete($ENV{'form.cleargroupsort'}); + delete($env{'form.cleargroupsort'}); } else { # This is a stupid error to give to the user. # It really tells them nothing. - $r->print(''.$bodytag. + my $html=&Apache::lonxml::xmlbegin(); + $r->print($html.''.$bodytag. 'Unable to tie hash to db file'); return OK; } @@ -233,36 +236,36 @@ END ## Configure hidden fields ## $hidden_fields = ''."\n"; - if (exists($ENV{'form.catalogmode'})) { + $env{'form.persistent_db_id'}.'" />'."\n"; + if (exists($env{'form.catalogmode'})) { $hidden_fields .= &hidden_field('catalogmode'); } - if (exists($ENV{'form.form'})) { + if (exists($env{'form.form'})) { $hidden_fields .= &hidden_field('form'); } - if (exists($ENV{'form.element'})) { + if (exists($env{'form.element'})) { $hidden_fields .= &hidden_field('element'); } - if (exists($ENV{'form.titleelement'})) { + if (exists($env{'form.titleelement'})) { $hidden_fields .= &hidden_field('titleelement'); } - if (exists($ENV{'form.mode'})) { + if (exists($env{'form.mode'})) { $hidden_fields .= &hidden_field('mode'); } ## ## Configure dynamic components of interface ## - if ($ENV{'form.catalogmode'} eq 'interactive') { + if ($env{'form.catalogmode'} eq 'interactive') { $closebutton="'/adm/searchcat?phase=disp_adv&'. - 'catalogmode='.$ENV{'form.catalogmode'}. - '&launch='.$ENV{'form.launch'}. - '&mode='.$ENV{'form.mode'}, + 'catalogmode='.$env{'form.catalogmode'}. + '&launch='.$env{'form.launch'}. + '&mode='.$env{'form.mode'}, text=>"Advanced Search", bug=>'Searching',}); - } elsif ($ENV{'form.searchmode'} eq 'course search') { + } elsif ($env{'form.searchmode'} eq 'course search') { &Apache::lonhtmlcommon::add_breadcrumb ({href=>'/adm/searchcat?phase=disp_adv&'. - 'catalogmode='.$ENV{'form.catalogmode'}. - '&launch='.$ENV{'form.launch'}. - '&mode='.$ENV{'form.mode'}, + 'catalogmode='.$env{'form.catalogmode'}. + '&launch='.$env{'form.launch'}. + '&mode='.$env{'form.mode'}, text=>"Course Search", bug=>'Searching',}); } ## ## Switch on the phase ## - if ($ENV{'form.phase'} eq 'disp_basic') { + if ($env{'form.phase'} eq 'disp_basic') { &print_basic_search_form($r,$closebutton,$hidden_fields); - } elsif ($ENV{'form.phase'} eq 'disp_adv') { + } elsif ($env{'form.phase'} eq 'disp_adv') { &print_advanced_search_form($r,$closebutton,$hidden_fields); - } elsif ($ENV{'form.phase'} eq 'results') { + } elsif ($env{'form.phase'} eq 'results') { &display_results($r,$importbutton,$closebutton,$diropendb); - } elsif ($ENV{'form.phase'} =~ /^(sort|run_search)$/) { + } elsif ($env{'form.phase'} =~ /^(sort|run_search)$/) { my ($query,$customquery,$customshow,$libraries,$pretty_string) = &get_persistent_data($persistent_db_file, ['query','customquery','customshow', 'libraries','pretty_string']); - if ($ENV{'form.phase'} eq 'sort') { + if ($env{'form.phase'} eq 'sort') { &print_sort_form($r,$pretty_string); - } elsif ($ENV{'form.phase'} eq 'run_search') { + } elsif ($env{'form.phase'} eq 'run_search') { &run_search($r,$query,$customquery,$customshow, $libraries,$pretty_string); } - } elsif ($ENV{'form.phase'} eq 'course_search') { + } elsif ($env{'form.phase'} eq 'course_search') { &course_search($r); - } elsif(($ENV{'form.phase'} eq 'basic_search') || - ($ENV{'form.phase'} eq 'adv_search')) { + } elsif(($env{'form.phase'} eq 'basic_search') || + ($env{'form.phase'} eq 'adv_search')) { # # We are running a search, try to parse it my ($query,$customquery,$customshow,$libraries) = (undef,undef,undef,undef); my $pretty_string; - if ($ENV{'form.phase'} eq 'basic_search') { + if ($env{'form.phase'} eq 'basic_search') { ($query,$pretty_string,$libraries) = &parse_basic_search($r,$closebutton,$hidden_fields); return OK if (! defined($query)); - &make_persistent({ basicexp => $ENV{'form.basicexp'}}, + &make_persistent({ basicexp => $env{'form.basicexp'}}, $persistent_db_file); } else { # Advanced search ($query,$customquery,$customshow,$libraries,$pretty_string) @@ -368,8 +366,11 @@ END &Apache::lonnet::logthis('lonsearchcat.pm: Unable to create '. 'needed table. lonmysql error:'. $errorstring); + my $html=&Apache::lonxml::xmlbegin(); $r->print(<Search Error +$html + +Search Error $bodytag Unable to create table in which to store search results. The search has been aborted. @@ -378,10 +379,13 @@ The search has been aborted. END return OK; } - delete($ENV{'form.launch'}); + delete($env{'form.launch'}); if (! &make_form_data_persistent($r,$persistent_db_file)) { - $r->print(<Search Error + my $html=&Apache::lonxml::xmlbegin(); + $r->print(< +Search Error $bodytag Unable to properly store search information. The search has been aborted. @@ -406,23 +410,23 @@ END # This routine sets non existant checkbox form elements to ''. # sub clean_up_environment { - if ($ENV{'form.phase'} eq 'basic_search') { - if (! exists($ENV{'form.related'})) { - $ENV{'form.related'} = ''; + if ($env{'form.phase'} eq 'basic_search') { + if (! exists($env{'form.related'})) { + $env{'form.related'} = ''; } - if (! exists($ENV{'form.domains'})) { - $ENV{'form.domains'} = ''; + if (! exists($env{'form.domains'})) { + $env{'form.domains'} = ''; } - } elsif ($ENV{'form.phase'} eq 'adv_search') { + } elsif ($env{'form.phase'} eq 'adv_search') { foreach my $field ('title','keywords','notes', 'abstract','standards','mime') { - if (! exists($ENV{'form.'.$field.'_related'})) { - $ENV{'form.'.$field.'_related'} = ''; + if (! exists($env{'form.'.$field.'_related'})) { + $env{'form.'.$field.'_related'} = ''; } } - } elsif ($ENV{'form.phase'} eq 'course_search') { - if (! exists($ENV{'form.crsrelated'})) { - $ENV{'form.crsrelated'} = ''; + } elsif ($env{'form.phase'} eq 'course_search') { + if (! exists($env{'form.crsrelated'})) { + $env{'form.crsrelated'} = ''; } } } @@ -430,7 +434,7 @@ sub clean_up_environment { sub hidden_field { my ($name,$value) = @_; if (! defined($value)) { - $value = $ENV{'form.'.$name}; + $value = $env{'form.'.$name}; } return ''.$/; } @@ -449,38 +453,51 @@ my %alreadyseen; my %hash; my $totalfound; +sub make_symb { + my ($id)=@_; + my ($mapid,$resid)=split(/\./,$id); + my $map=$hash{'map_id_'.$mapid}; + my $res=$hash{'src_'.$id}; + my $symb=&Apache::lonnet::encode_symb($map,$resid,$res); + return $symb; +} + sub course_search { my $r=shift; my $bodytag=&Apache::loncommon::bodytag('Course Search'); - my $pretty_search_string = ''.$ENV{'form.courseexp'}.''; - my $search_string = $ENV{'form.courseexp'}; + my $pretty_search_string = ''.$env{'form.courseexp'}.''; + my $search_string = $env{'form.courseexp'}; my @New_Words; - if ($ENV{'form.crsrelated'}) { - ($search_string,@New_Words) = &related_version($ENV{'form.courseexp'}); + undef(%alreadyseen); + if ($env{'form.crsrelated'}) { + ($search_string,@New_Words) = &related_version($env{'form.courseexp'}); if (@New_Words) { $pretty_search_string .= ' '.&mt("with related words").": @New_Words."; } else { $pretty_search_string .= ' '.&mt('with no related words')."."; } } - my $fulltext=$ENV{'form.crsfulltext'}; - my $discuss=$ENV{'form.crsdiscuss'}; + my $fulltext=$env{'form.crsfulltext'}; + my $discuss=$env{'form.crsdiscuss'}; my @allwords=($search_string,@New_Words); $totalfound=0; - $r->print('LON-CAPA Course Search'. + my $html=&Apache::lonxml::xmlbegin(); + $r->print($html.'LON-CAPA Course Search'. $bodytag.'
'.$pretty_search_string.'

'.&mt('Course content').':
'); $r->rflush(); # ======================================================= Go through the course - undef %alreadyseen; - %alreadyseen=(); my $c=$r->connection; - if (tie(%hash,'GDBM_File',$ENV{'request.course.fn'}.".db", + if (tie(%hash,'GDBM_File',$env{'request.course.fn'}.".db", &GDBM_READER(),0640)) { - foreach (keys %hash) { + foreach (sort(keys(%hash))) { if ($c->aborted()) { last; } - if (($_=~/^src\_(.+)$/) && (!$alreadyseen{$hash{$_}})) { - &checkonthis($r,$hash{$_},0,$hash{'title_'.$1},$fulltext, - @allwords); + if (($_=~/^src\_(.+)$/)) { + if ($hash{'randomout_'.$1} & !$env{'request.role.adv'}) { + next; + } + my $symb=&make_symb($1); + &checkonthis($r,$1,$hash{$_},0,&Apache::lonnet::gettitle($symb), + $fulltext,$symb,@allwords); } } untie(%hash); @@ -496,8 +513,8 @@ sub course_search { my $navmap = Apache::lonnavmaps::navmap->new(); my @allres=$navmap->retrieveResources(); my %discussiontime = &Apache::lonnet::dump('discussiontimes', - $ENV{'course.'.$ENV{'request.course.id'}.'.domain'}, - $ENV{'course.'.$ENV{'request.course.id'}.'.num'}); + $env{'course.'.$env{'request.course.id'}.'.domain'}, + $env{'course.'.$env{'request.course.id'}.'.num'}); foreach my $resource (@allres) { my $result = ''; my $applies = 0; @@ -510,9 +527,9 @@ sub course_search { } } if (defined($discussiontime{$ressymb})) { - my %contrib = &Apache::lonnet::restore($ressymb,$ENV{'request.course.id'}, - $ENV{'course.'.$ENV{'request.course.id'}.'.domain'}, - $ENV{'course.'.$ENV{'request.course.id'}.'.num'}); + my %contrib = &Apache::lonnet::restore($ressymb,$env{'request.course.id'}, + $env{'course.'.$env{'request.course.id'}.'.domain'}, + $env{'course.'.$env{'request.course.id'}.'.num'}); if ($contrib{'version'}) { for (my $id=1;$id<=$contrib{'version'};$id++) { unless (($contrib{'hidden'}=~/\.$id\./) || ($contrib{'deleted'}=~/\.$id\./)) { @@ -570,15 +587,22 @@ sub course_search { # =============================== This pulls up a resource and its dependencies sub checkonthis { - my ($r,$url,$level,$title,$fulltext,@allwords)=@_; - $alreadyseen{$url}=1; + my ($r,$id,$url,$level,$title,$fulltext,$symb,@allwords)=@_; + $alreadyseen{$id}=1; + if (&Apache::loncommon::connection_aborted($r)) { return; } $r->rflush(); - my $result=&Apache::lonnet::metadata($url,'title').' '. - &Apache::lonnet::metadata($url,'subject').' '. - &Apache::lonnet::metadata($url,'abstract').' '. - &Apache::lonnet::metadata($url,'keywords'); - if (($url) && ($fulltext)) { - $result.=&Apache::lonnet::ssi_body($url); + + my $result=$title.' '; + if ($env{'request.role.adv'} || !$hash{'encrypted_'.$id}) { + $result.=&Apache::lonnet::metadata($url,'title').' '. + &Apache::lonnet::metadata($url,'subject').' '. + &Apache::lonnet::metadata($url,'abstract').' '. + &Apache::lonnet::metadata($url,'keywords'); + } + my ($extension)=($url=~/\.(\w+)$/); + if (&Apache::loncommon::fileembstyle($extension) eq 'ssi' && + ($url) && ($fulltext)) { + $result.=&Apache::lonnet::ssi_body($url.'?symb='.&Apache::lonnet::escape($symb)); } $result=~s/\s+/ /gs; my $applies = 0; @@ -589,8 +613,15 @@ sub checkonthis { for (my $i=0;$i<=$level*5;$i++) { $r->print(' '); } - $r->print(''. - ($title?$title:$url).'
'); + my $href=$url; + if ($hash{'encrypted_'.$id} && !$env{'request.role.adv'}) { + $href=&Apache::lonenc::encrypted($href) + .'?symb='.&Apache::lonenc::encrypted($symb); + } else { + $href.='?symb='.&Apache::lonnet::escape($symb); + } + $r->print(''.($title?$title:$url). + '
'); $totalfound++; } elsif ($fulltext) { $r->print(' .'); @@ -600,8 +631,8 @@ sub checkonthis { my $dependencies= &Apache::lonnet::metadata($url,'dependencies'); foreach (split(/\,/,$dependencies)) { - if (($_=~/^\/res\//) && (!$alreadyseen{$_})) { - &checkonthis($r,$_,$level+1,'',$fulltext,@allwords); + if (($_=~/^\/res\//) && (!$alreadyseen{$id})) { + &checkonthis($r,$id,$_,$level+1,'',$fulltext,undef,@allwords); } } } @@ -627,8 +658,9 @@ sub untiehash { } # End of course search scoping sub search_html_header { + my $html=&Apache::lonxml::xmlbegin(); my $Str = < +$html The LearningOnline Network with CAPA @@ -651,32 +683,36 @@ Prints the form for the basic search. S ###################################################################### sub print_basic_search_form { my ($r,$closebutton,$hidden_fields) = @_; - my $result = ($ENV{'form.catalogmode'} ne 'groupsearch'); + my $result = ($env{'form.catalogmode'} ne 'groupsearch'); my $bodytag=&Apache::loncommon::bodytag('Search'). &Apache::lonhtmlcommon::breadcrumbs(undef,'Searching','Search_Basic', undef,undef, - $ENV{'form.catalogmode'} ne 'groupsearch'); + $env{'form.catalogmode'} ne 'groupsearch'); my $scrout = &search_html_header().$bodytag; - if (&Apache::lonnet::allowed('bre',$ENV{'request.role.domain'})) { + if (&Apache::lonnet::allowed('bre',$env{'request.role.domain'})) { # Define interface components - my $userelatedwords= + my $userelatedwords= ''; + my $onlysearchdomain=''; + my $inclext= ''; my $adv_search_link = ''.&mt('Advanced Search').''; # $scrout.='
'; } else { # No need to tell them they are searching @@ -695,7 +731,7 @@ sub print_basic_search_form { ''. &Apache::lonhtmlcommon::textbox ('basicexp', - &HTML::Entities::encode($ENV{'form.basicexp'},'<>&"'),50 + &HTML::Entities::encode($env{'form.basicexp'},'<>&"'),50 ). '
'. ''.&searchhelp().''.''. @@ -703,7 +739,8 @@ sub print_basic_search_form { ''.(' 'x3).$adv_search_link.''.'
'. ''.(' 'x1).$userelatedwords.''.'
'. ''.(' 'x1).$onlysearchdomain.''.'
'. - ''. + ''.(' 'x1).$inclext.''.'
'. + ''. ''.$/; # $scrout .= ''. @@ -716,7 +753,7 @@ sub print_basic_search_form { ''.$/; $scrout .= ''.$/.''.'
'; } - if ($ENV{'request.course.id'}) { + if ($env{'request.course.id'}) { my %lt=&Apache::lonlocal::texthash('srch' => 'Search', 'header' => 'Course Search', 'note' => 'Enter terms or phrases, then press "Search" below', @@ -740,21 +777,21 @@ $lt{'note'}. ENDCOURSESEARCH $scrout.=' '. &Apache::lonhtmlcommon::textbox('courseexp', - $ENV{'form.courseexp'},40); + $env{'form.courseexp'},40); my $crscheckbox = &Apache::lonhtmlcommon::checkbox('crsfulltext', - $ENV{'form.crsfulltext'}); + $env{'form.crsfulltext'}); my $relcheckbox = &Apache::lonhtmlcommon::checkbox('crsrelated', - $ENV{'form.crsrelated'}); + $env{'form.crsrelated'}); my $discheckbox = &Apache::lonhtmlcommon::checkbox('crsdiscuss', - $ENV{'form.crsrelated'}); + $env{'form.crsrelated'}); $scrout.=(< -$relcheckbox $lt{'use'} -$crscheckbox $lt{'full'} -$discheckbox $lt{'disc'} + + +

 

@@ -788,7 +825,7 @@ sub print_advanced_search_form{ &Apache::lonhtmlcommon::breadcrumbs(undef,'Searching', 'Search_Advanced', undef,undef, - $ENV{'form.catalogmode'} ne 'groupsearch'); + $env{'form.catalogmode'} ne 'groupsearch'); my %lt=&Apache::lonlocal::texthash('srch' => 'Search', 'reset' => 'Reset', 'help' => 'Help'); @@ -823,18 +860,20 @@ ENDHEADER 'abstract' => 1, 'standards'=> 1, 'mime' => 1, + 'subject' => 1, ); # - foreach my $field ('title','author','owner','authorspace','modifyinguser', - 'keywords','notes','abstract','standards','mime') { + foreach my $field ('title','author','subject','owner','authorspace', + 'modifyinguser','keywords','notes','abstract', + 'standards','mime') { $scrout.=''.&titlefield($fields{$field}).''. &Apache::lonmeta::prettyinput($field, - $ENV{'form.'.$field}, + $env{'form.'.$field}, $field, 'advsearch', $related_word_search{$field}, '', - $ENV{'form.'.$field.'_related'}, + $env{'form.'.$field.'_related'}, 50); if ($related_word_search{$field}) { $scrout .= 'related words'; @@ -848,7 +887,7 @@ ENDHEADER ''.&titlefield($fields{$field}).''. ''. &Apache::lonmeta::prettyinput($field, - $ENV{'form.'.$field}, + $env{'form.'.$field}, $field, 'advsearch', 0). @@ -857,19 +896,22 @@ ENDHEADER $scrout.=''. &titlefield(&mt('MIME Type Category')).''. &Apache::loncommon::filecategoryselect('category', - $ENV{'form.category'}). + $env{'form.category'}). ''.$/; $scrout.=''. &titlefield(&mt('Domains')).''. &Apache::loncommon::domain_select('domains', - $ENV{'form.domains'},1). - ''.$/; + $env{'form.domains'},1). + '
'.$/; # # Misc metadata $scrout.=''. &titlefield(&mt('Copyright/Distribution')).''. &Apache::lonmeta::selectbox('copyright', - $ENV{'form.copyright'}, + $env{'form.copyright'}, \&Apache::loncommon::copyrightdescription, ( undef, &Apache::loncommon::copyrightids) @@ -877,7 +919,7 @@ ENDHEADER $scrout.=''. &titlefield(&mt('Language')).''. &Apache::lonmeta::selectbox('language', - $ENV{'form.language'}, + $env{'form.language'}, \&Apache::loncommon::languagedescription, ('any',&Apache::loncommon::languageids) ).''; @@ -1059,16 +1101,16 @@ Outputs: text for box with view options ###################################################################### sub viewoptions { my $scrout; - if (! defined($ENV{'form.viewselect'})) { - $ENV{'form.viewselect'}='detailed'; + if (! defined($env{'form.viewselect'})) { + $env{'form.viewselect'}='detailed'; } $scrout.=&Apache::lonmeta::selectbox('viewselect', - $ENV{'form.viewselect'}, + $env{'form.viewselect'}, \&viewoptiontext, sort(keys(%Views))); $scrout.= '  '; my $countselect = &Apache::lonmeta::selectbox('show', - $ENV{'form.show'}, + $env{'form.show'}, undef, (10,20,50,100,1000,10000)); $scrout .= (' 'x2).&mt('[_1] Records per Page',$countselect). @@ -1108,7 +1150,7 @@ Outputs: returns undef on database error This function is the reverse of &make_persistent() for form data. Retrieve persistent data from %persistent_db. Retrieved items will have their -values unescaped. If a form value already exists in $ENV, it will not be +values unescaped. If a form value already exists in $env, it will not be overwritten. Form values that are array references may have values appended to them. @@ -1130,20 +1172,20 @@ sub get_persistent_form_data { next if ($name !~ /^form./); # Kludgification begins! if ($name eq 'form.domains' && - $ENV{'form.searchmode'} eq 'basic' && - $ENV{'form.phase'} ne 'disp_basic') { + $env{'form.searchmode'} eq 'basic' && + $env{'form.phase'} ne 'disp_basic') { next; } # End kludge (hopefully) - next if (exists($ENV{$name})); + next if (exists($env{$name})); my @values = map { &Apache::lonnet::unescape($_); } split(',',$persistent_db{$name}); next if (@values <1); if ($arrays_allowed{$name}) { - $ENV{$name} = [@values]; + $env{$name} = [@values]; } else { - $ENV{$name} = $values[0] if ($values[0]); + $env{$name} = $values[0] if ($values[0]); } } untie (%persistent_db); @@ -1248,9 +1290,9 @@ sub make_form_data_persistent { my $r = shift; my $filename = shift; my %save; - foreach (keys(%ENV)) { + foreach (keys(%env)) { next if (!/^form/ || /submit/); - $save{$_} = $ENV{$_}; + $save{$_} = $env{$_}; } return &make_persistent(\%save,$filename); } @@ -1298,36 +1340,36 @@ sub parse_advanced_search { 'lastrevisiondatestart_month','lastrevisiondatestart_day', 'lastrevisiondatestart_year','lastrevisiondateend_month', 'lastrevisiondateend_day','lastrevisiondateend_year') { - $ENV{'form.'.$field}=~s/[^\w\/\s\(\)\=\-\"\']//g; + $env{'form.'.$field}=~s/[^\w\/\s\(\)\=\-\"\']//g; } foreach ('mode','form','element') { # is this required? Hmmm. - next if (! exists($ENV{'form.'.$_})); - $ENV{'form.'.$_}=&Apache::lonnet::unescape($ENV{'form.'.$_}); - $ENV{'form.'.$_}=~s/[^\w\/\s\(\)\=\-\"\']//g; + next if (! exists($env{'form.'.$_})); + $env{'form.'.$_}=&Apache::lonnet::unescape($env{'form.'.$_}); + $env{'form.'.$_}=~s/[^\w\/\s\(\)\=\-\"\']//g; } # Preprocess the category form element. - $ENV{'form.category'} = 'any' if (! defined($ENV{'form.category'}) || - ref($ENV{'form.category'})); + $env{'form.category'} = 'any' if (! defined($env{'form.category'}) || + ref($env{'form.category'})); # # Check to see if enough information was filled in foreach my $field (@BasicFields) { - if (&filled($ENV{'form.'.$field})) { + if (&filled($env{'form.'.$field})) { $fillflag++; } } foreach my $field (@StatsFields,@EvalFields) { - if (&filled($ENV{'form.'.$field.'_max'})) { + if (&filled($env{'form.'.$field.'_max'})) { $fillflag++; } - if (&filled($ENV{'form.'.$field.'_min'})) { + if (&filled($env{'form.'.$field.'_min'})) { $fillflag++; } } for my $field ('lowestgradelevel','highestgradelevel') { - if ( $ENV{'form.'.$field} =~ /^\d+$/ && - $ENV{'form.'.$field} > 0) { + if ( $env{'form.'.$field} =~ /^\d+$/ && + $env{'form.'.$field} > 0) { $fillflag++; } } @@ -1342,21 +1384,21 @@ sub parse_advanced_search { my $font = ''; # Evaluate logical expression AND/OR/NOT phrase fields. foreach my $field (@BasicFields) { - next if (!defined($ENV{'form.'.$field}) || $ENV{'form.'.$field} eq ''); + next if (!defined($env{'form.'.$field}) || $env{'form.'.$field} eq ''); my ($error,$SQLQuery) = - &process_phrase_input($ENV{'form.'.$field}, - $ENV{'form.'.$field.'_related'},$field); + &process_phrase_input($env{'form.'.$field}, + $env{'form.'.$field.'_related'},$field); if (defined($error)) { &output_unparsed_phrase_error($r,$closebutton,'phase=disp_adv', $hidden_fields,$field); return; } else { $pretty_search_string .= - $font.$field.': '.$ENV{'form.'.$field}; - if ($ENV{'form.'.$field.'_related'}) { + $font.$field.': '.$env{'form.'.$field}; + if ($env{'form.'.$field.'_related'}) { my @Words = &Apache::loncommon::get_related_words - ($ENV{'form.'.$field}); + ($env{'form.'.$field}); if (@Words) { $pretty_search_string.= ' with related words: '. join(', ',@Words[0..4]); @@ -1372,11 +1414,11 @@ sub parse_advanced_search { # Make the 'mime' from 'form.category' and 'form.extension' # my $searchphrase; - if (exists($ENV{'form.category'}) && - $ENV{'form.category'} !~ /^\s*$/ && - $ENV{'form.category'} ne 'any') { + if (exists($env{'form.category'}) && + $env{'form.category'} !~ /^\s*$/ && + $env{'form.category'} ne 'any') { my @extensions = &Apache::loncommon::filecategorytypes - ($ENV{'form.category'}); + ($env{'form.category'}); if (scalar(@extensions) > 0) { $searchphrase = join(' OR ',@extensions); } @@ -1389,45 +1431,45 @@ sub parse_advanced_search { } # # Evaluate option lists - if ($ENV{'form.lowestgradelevel'} && - $ENV{'form.lowestgradelevel'} ne '0' && - $ENV{'form.lowestgradelevel'} =~ /^\d+$/) { + if ($env{'form.lowestgradelevel'} && + $env{'form.lowestgradelevel'} ne '0' && + $env{'form.lowestgradelevel'} =~ /^\d+$/) { push(@queries, - '(lowestgradelevel>='.$ENV{'form.lowestgradelevel'}.')'); + '(lowestgradelevel>='.$env{'form.lowestgradelevel'}.')'); $pretty_search_string.="lowestgradelevel>=". - $ENV{'form.lowestgradelevel'}."
\n"; + $env{'form.lowestgradelevel'}."
\n"; } - if ($ENV{'form.highestgradelevel'} && - $ENV{'form.highestgradelevel'} ne '0' && - $ENV{'form.highestgradelevel'} =~ /^\d+$/) { + if ($env{'form.highestgradelevel'} && + $env{'form.highestgradelevel'} ne '0' && + $env{'form.highestgradelevel'} =~ /^\d+$/) { push(@queries, - '(highestgradelevel<='.$ENV{'form.highestgradelevel'}.')'); + '(highestgradelevel<='.$env{'form.highestgradelevel'}.')'); $pretty_search_string.="highestgradelevel<=". - $ENV{'form.highestgradelevel'}."
\n"; + $env{'form.highestgradelevel'}."
\n"; } - if ($ENV{'form.language'} and $ENV{'form.language'} ne 'any') { - push @queries,"(language like \"$ENV{'form.language'}\")"; + if ($env{'form.language'} and $env{'form.language'} ne 'any') { + push @queries,"(language like \"$env{'form.language'}\")"; $pretty_search_string.=$font."language= ". - &Apache::loncommon::languagedescription($ENV{'form.language'}). + &Apache::loncommon::languagedescription($env{'form.language'}). "
\n"; } - if ($ENV{'form.copyright'} and $ENV{'form.copyright'} ne 'any') { - push @queries,"(copyright like \"$ENV{'form.copyright'}\")"; + if ($env{'form.copyright'} and $env{'form.copyright'} ne 'any') { + push @queries,"(copyright like \"$env{'form.copyright'}\")"; $pretty_search_string.=$font."copyright = ". - &Apache::loncommon::copyrightdescription($ENV{'form.copyright'}). + &Apache::loncommon::copyrightdescription($env{'form.copyright'}). "
\n"; } # # Statistics foreach my $field (@StatsFields,@EvalFields) { my ($min,$max); - if (exists($ENV{'form.'.$field.'_min'}) && - $ENV{'form.'.$field.'_min'} ne '') { - $min = $ENV{'form.'.$field.'_min'}; - } - if (exists($ENV{'form.'.$field.'_max'}) && - $ENV{'form.'.$field.'_max'} ne '') { - $max = $ENV{'form.'.$field.'_max'}; + if (exists($env{'form.'.$field.'_min'}) && + $env{'form.'.$field.'_min'} ne '') { + $min = $env{'form.'.$field.'_min'}; + } + if (exists($env{'form.'.$field.'_max'}) && + $env{'form.'.$field.'_max'} ne '') { + $max = $env{'form.'.$field.'_max'}; } next if (! defined($max) && ! defined($min)); if (defined($min) && defined($max)) { @@ -1480,17 +1522,17 @@ sub parse_advanced_search { ## because I was unable to figureout exactly how it worked and could ## not imagine people actually using it. MH ## - # if ($ENV{'form.custommetadata'}) { + # if ($env{'form.custommetadata'}) { # $pretty_search_string .=$font."Custom Metadata Search: ". - # $ENV{'form.custommetadata'}."
\n"; + # $env{'form.custommetadata'}."
\n"; # $customquery=&build_custommetadata_query('custommetadata', - # $ENV{'form.custommetadata'}); + # $env{'form.custommetadata'}); # } my $customshow=undef; - # if ($ENV{'form.customshow'}) { + # if ($env{'form.customshow'}) { # $pretty_search_string .=$font."Custom Metadata Display: ". - # $ENV{'form.customshow'}."
\n"; - # $customshow=$ENV{'form.customshow'}; + # $env{'form.customshow'}."
\n"; + # $customshow=$env{'form.customshow'}; # $customshow=~s/[^\w\s]//g; # my @fields=split(/\s+/,$customshow); # $customshow=join(" ",@fields); @@ -1498,47 +1540,49 @@ sub parse_advanced_search { ## ## Deal with restrictions to given domains ## - my ($libraries_to_query,$pretty_domains_string) = + my ($libraries_to_query,$pretty_domains_string,$domain_sql_restriction) = &parse_domain_restrictions(); - $pretty_search_string .= $pretty_domains_string."
\n"; + if ((defined($domain_sql_restriction)) && ($domain_sql_restriction ne '')) { + push(@queries,$domain_sql_restriction); + $pretty_search_string .= $pretty_domains_string."
\n"; + } # if (@queries) { $query="SELECT * FROM metadata WHERE (".join(") AND (",@queries).')'; } elsif ($customquery) { $query = ''; } - # &Apache::lonnet::logthis('query = '.$/.$query); + #&Apache::lonnet::logthis('advanced query = '.$/.$query); return ($query,$customquery,$customshow,$libraries_to_query, $pretty_search_string); } sub parse_domain_restrictions { my $libraries_to_query = undef; - # $ENV{'form.domains'} can be either a scalar or an array reference. + # $env{'form.domains'} can be either a scalar or an array reference. # We need an array. - if (! exists($ENV{'form.domains'}) || $ENV{'form.domains'} eq '') { - return (undef,''); - } - my @allowed_domains; - if (ref($ENV{'form.domains'})) { - @allowed_domains = @{$ENV{'form.domains'}}; - } else { - @allowed_domains = ($ENV{'form.domains'}); + if (! exists($env{'form.domains'}) || $env{'form.domains'} eq '') { + return (undef,'',undef); } + my @allowed_domains = &Apache::loncommon::get_env_multiple('form.domains'); # my %domain_hash = (); my $pretty_domains_string; + my $domain_sql_restriction; foreach (@allowed_domains) { $domain_hash{$_}++; } if ($domain_hash{'any'}) { $pretty_domains_string = "In all LON-CAPA domains."; + $domain_sql_restriction = undef; } else { if (@allowed_domains > 1) { $pretty_domains_string = "In LON-CAPA domains:"; } else { $pretty_domains_string = "In LON-CAPA domain "; } + $domain_sql_restriction = + '(domain="'.join('" OR domain="',@allowed_domains).'")'; foreach (sort @allowed_domains) { $pretty_domains_string .= "".$_." "; } @@ -1548,7 +1592,9 @@ sub parse_domain_restrictions { } } } - return ($libraries_to_query,$pretty_domains_string); + return ($libraries_to_query, + $pretty_domains_string, + $domain_sql_restriction); } ###################################################################### @@ -1569,19 +1615,19 @@ sub parse_basic_search { # # Clean up fields for safety for my $field ('basicexp') { - $ENV{"form.$field"}=~s/[^\w\s\'\"\!\(\)\-]//g; + $env{"form.$field"}=~s/[^\w\s\'\"\!\(\)\-]//g; } foreach ('mode','form','element') { # is this required? Hmmm. - next unless (exists($ENV{"form.$_"})); - $ENV{"form.$_"}=&Apache::lonnet::unescape($ENV{"form.$_"}); - $ENV{"form.$_"}=~s/[^\w\/\s\(\)\=\-\"\']//g; + next unless (exists($env{"form.$_"})); + $env{"form.$_"}=&Apache::lonnet::unescape($env{"form.$_"}); + $env{"form.$_"}=~s/[^\w\/\s\(\)\=\-\"\']//g; } - my ($libraries_to_query,$pretty_domains_string) = + my ($libraries_to_query,$pretty_domains_string,$domain_sql_restriction) = &parse_domain_restrictions(); # # Check to see if enough of a query is filled in - my $search_string = $ENV{'form.basicexp'}; + my $search_string = $env{'form.basicexp'}; if (! &filled($search_string)) { &output_blank_field_error($r,$closebutton,'phase=disp_basic'); return OK; @@ -1593,7 +1639,7 @@ sub parse_basic_search { 'notes','abstract','keywords') ).')'; my ($error,$SQLQuery) = &process_phrase_input($search_string, - $ENV{'form.related'}, + $env{'form.related'}, $searchfield); if ($error) { &output_unparsed_phrase_error($r,$closebutton,'phase=disp_basic', @@ -1601,6 +1647,9 @@ sub parse_basic_search { return; } push(@Queries,$SQLQuery); + if (defined($domain_sql_restriction) && $domain_sql_restriction ne '') { + push(@Queries,$domain_sql_restriction); + } #foreach my $q (@Queries) { # &Apache::lonnet::logthis(' '.$q); #} @@ -1611,7 +1660,7 @@ sub parse_basic_search { } $pretty_search_string .= "
\n"; $pretty_search_string =~ s:^
and ::; - # &Apache::lonnet::logthis($final_query); + #&Apache::lonnet::logthis('simple search final query = '.$/.$final_query); return ($final_query,$pretty_search_string, $libraries_to_query); } @@ -1965,13 +2014,13 @@ sub copyright_check { $Metadata->{'url'}); # Check for priv if (($Metadata->{'copyright'} eq 'priv') && - (($ENV{'user.name'} ne $resname) && - ($ENV{'user.domain'} ne $resdom))) { + (($env{'user.name'} ne $resname) && + ($env{'user.domain'} ne $resdom))) { return 0; } # Check for domain if (($Metadata->{'copyright'} eq 'domain') && - ($ENV{'user.domain'} ne $resdom)) { + ($env{'user.domain'} ne $resdom)) { return 0; } return 1; @@ -2052,7 +2101,7 @@ sub print_sort_form { my $bodytag=&Apache::loncommon::bodytag(undef,undef,undef,1). &Apache::lonhtmlcommon::breadcrumbs (undef,'Searching','Searching',undef,undef, - $ENV{'form.catalogmode'} ne 'groupsearch'); + $env{'form.catalogmode'} ne 'groupsearch'); ## my %SortableFields=&Apache::lonlocal::texthash( @@ -2071,7 +2120,7 @@ sub print_sort_form { lastrevisiondate => 'Revision Date' ); ## - my $table = $ENV{'form.table'}; + my $table = $env{'form.table'}; return if (! &ensure_db_and_table($r,$table)); ## ## Get the number of results @@ -2085,13 +2134,14 @@ sub print_sort_form { return; } my $result; + my $html=&Apache::lonxml::xmlbegin(); $result.=< +$html "); # } return; @@ -2569,7 +2624,7 @@ sub display_results { ## ## Set viewing function ## - my $viewfunction = $Views{$ENV{'form.viewselect'}}; + my $viewfunction = $Views{$env{'form.viewselect'}}; if (!defined($viewfunction)) { $r->print("Internal Error - Bad view selected.\n"); $r->rflush(); @@ -2585,7 +2640,7 @@ sub display_results { my $action = "/adm/searchcat?phase=results"; ## ## Deal with groupsearch by opening the groupsearch db file. - if ($ENV{'form.catalogmode'} eq 'groupsearch') { + if ($env{'form.catalogmode'} eq 'groupsearch') { if (! tie(%groupsearch_db,'GDBM_File',$diropendb, &GDBM_WRCREAT(),0640)) { $r->print('Unable to store import results.'); @@ -2595,7 +2650,7 @@ sub display_results { } ## ## Prepare the table for querying - my $table = $ENV{'form.table'}; + my $table = $env{'form.table'}; return if (! &ensure_db_and_table($r,$table)); ## ## Get the number of results @@ -2609,21 +2664,21 @@ sub display_results { } ## ## Determine how many results we need to get - $ENV{'form.start'} = 1 if (! exists($ENV{'form.start'})); - $ENV{'form.show'} = 20 if (! exists($ENV{'form.show'})); - if (exists($ENV{'form.prev'})) { - $ENV{'form.start'} -= $ENV{'form.show'}; - } elsif (exists($ENV{'form.next'})) { - $ENV{'form.start'} += $ENV{'form.show'}; - } - $ENV{'form.start'} = 1 if ($ENV{'form.start'}<1); - $ENV{'form.start'} = $total_results if ($ENV{'form.start'}>$total_results); - my $min = $ENV{'form.start'}; + $env{'form.start'} = 1 if (! exists($env{'form.start'})); + $env{'form.show'} = 20 if (! exists($env{'form.show'})); + if (exists($env{'form.prev'})) { + $env{'form.start'} -= $env{'form.show'}; + } elsif (exists($env{'form.next'})) { + $env{'form.start'} += $env{'form.show'}; + } + $env{'form.start'} = 1 if ($env{'form.start'}<1); + $env{'form.start'} = $total_results if ($env{'form.start'}>$total_results); + my $min = $env{'form.start'}; my $max; - if ($ENV{'form.show'} eq 'all') { + if ($env{'form.show'} eq 'all') { $max = $total_results ; } else { - $max = $min + $ENV{'form.show'} - 1; + $max = $min + $env{'form.show'} - 1; $max = $total_results if ($max > $total_results); } ## @@ -2633,11 +2688,77 @@ sub display_results { &hidden_field('persistent_db_id'). &hidden_field('start') ); + # + # Build sorting selector + my @fields = + ( + {key=>'default' }, + {key=>'title' }, + {key =>'author' }, + {key =>'subject'}, + {key =>'url',desc=>'URL'}, + {key =>'keywords'}, + {key =>'language'}, + {key =>'creationdate'}, + {key =>'lastrevisiondate'}, + {key =>'owner'}, + {key =>'copyright'}, + {key =>'authorspace'}, + {key =>'lowestgradelevel'}, + {key =>'highestgradelevel'}, + {key =>'standards',desc=>'Standards'}, + {key =>'count',desc=>'Number of accesses'}, + {key =>'stdno',desc=>'Students Attempting'}, + {key =>'avetries',desc=>'Average Number of Tries'}, + {key =>'difficulty',desc=>'Mean Degree of Difficulty'}, + {key =>'disc',desc=>'Mean Degree of Discrimination'}, + {key =>'clear',desc=>'Evaluation: Clear'}, + {key =>'technical',desc=>'Evaluation: Technically Correct'}, + {key =>'correct',desc=>'Evaluation: Material is Correct'}, + {key =>'helpful',desc=>'Evaluation: Material is Helpful'}, + {key =>'depth',desc=>'Evaluation: Material has Depth'}, + ); + my %fieldnames = &Apache::lonmeta::fieldnames(); + my @field_order; + foreach my $field_data (@fields) { + push(@field_order,$field_data->{'key'}); + if (! exists($field_data->{'desc'})) { + $field_data->{'desc'}=$fieldnames{$field_data->{'key'}}; + } else { + if (! defined($field_data->{'desc'})) { + $field_data->{'desc'} = ucfirst($field_data->{'key'}); + } + $field_data->{'desc'} = &mt($field_data->{'desc'}); + } + } + my %sort_fields = map {$_->{'key'},$_->{'desc'}} @fields; + $sort_fields{'select_form_order'} = \@field_order; + $env{'form.sortorder'} = 'desc' if (! exists($env{'form.sortorder'})); + $env{'form.sortfield'} = 'count' if (! exists($env{'form.sortfield'})); + if (! exists($env{'form.sortorder'})) { + if ($env{'form.sortfield'}=~/^(count|stdno|disc|clear|technical|correct|helpful)$/) { + $env{'form.sortorder'}='desc'; + } else { + $env{'form.sortorder'}='asc'; + } + } + my $sortform = &mt('Sort by [_1] [_2]', + &Apache::loncommon::select_form($env{'form.sortfield'}, + 'sortfield', + %sort_fields), + &Apache::loncommon::select_form($env{'form.sortorder'}, + 'sortorder', + (asc =>&mt('Ascending'), + desc=>&mt('Descending') + )) + ); ## ## Output links (if necessary) for 'prev' and 'next' pages. $r->print - ('
'. - &prev_next_buttons($min,$ENV{'form.show'},$total_results). + ('
'. + ''.$sortform.''. + ''. + &prev_next_buttons($min,$env{'form.show'},$total_results). ''. &viewoptions().'
' ); @@ -2647,13 +2768,33 @@ sub display_results { ""); return; } else { - $r->print - ("
Results $min to $max out of $total_results
\n"); + $r->print('
'. + mt('Results [_1] to [_2] out of [_3]', + $min,$max,$total_results). + "
\n"); } ## ## Get results from MySQL table - my @Results = &Apache::lonmysql::get_rows($table, - 'id>='.$min.' AND id<='.$max); + my $sort_command = 'id>='.$min.' AND id<='.$max; + my $order; + if (exists($env{'form.sortorder'})) { + if ($env{'form.sortorder'} eq 'asc') { + $order = 'ASC'; + } elsif ($env{'form.sortorder'} eq 'desc') { + $order = 'DESC'; + } else { + $order = ''; + } + } else { + $order = ''; + } + if ($env{'form.sortfield'} ne 'default' && + exists($sort_fields{$env{'form.sortfield'}})) { + $sort_command = $env{'form.sortfield'}.' IS NOT NULL '. + 'ORDER BY '.$env{'form.sortfield'}.' '.$order. + ' LIMIT '.($min-1).','.($max-$min+1); + } + my @Results = &Apache::lonmysql::get_rows($table,$sort_command); ## ## Loop through the results and output them. foreach my $row (@Results) { @@ -2679,11 +2820,11 @@ sub display_results { } else { $r->print ('
'. - &prev_next_buttons($min,$ENV{'form.show'},$total_results, - "table=".$ENV{'form.table'}. + &prev_next_buttons($min,$env{'form.show'},$total_results, + "table=".$env{'form.table'}. "&phase=results". "&persistent_db_id=". - $ENV{'form.persistent_db_id'}) + $env{'form.persistent_db_id'}) ."
\n" ); } @@ -2701,7 +2842,7 @@ sub display_results { =item &catalogmode_output($title,$url,$fnum,$checkbox_num) Returns html needed for the various catalog modes. Gets inputs from -$ENV{'form.catalogmode'}. Stores data in %groupsearch_db. +$env{'form.catalogmode'}. Stores data in %groupsearch_db. =cut @@ -2710,16 +2851,16 @@ $ENV{'form.catalogmode'}. Stores data i sub catalogmode_output { my $output = ''; my ($title,$url,$fnum,$checkbox_num) = @_; - if ($ENV{'form.catalogmode'} eq 'interactive') { + if ($env{'form.catalogmode'} eq 'interactive') { $title=~ s/\'/\\\'/g; - if ($ENV{'form.catalogmode'} eq 'interactive') { + if ($env{'form.catalogmode'} eq 'interactive') { $output.=< END } - } elsif ($ENV{'form.catalogmode'} eq 'groupsearch') { + } elsif ($env{'form.catalogmode'} eq 'groupsearch') { $groupsearch_db{"pre_${fnum}_link"}=$url; $groupsearch_db{"pre_${fnum}_title"}=$title; $output.=<$_:"; @@ -2844,7 +2985,7 @@ sub handle_custom_fields { Output the proper html headers and javascript code to deal with different calling modes. -Takes most inputs directly from %ENV, except $mode. +Takes most inputs directly from %env, except $mode. =over 4 @@ -2889,8 +3030,8 @@ sub search_results_header { # output beginning of search page # conditional output of script functions dependent on the mode in # which the search was invoked - if ($ENV{'form.catalogmode'} eq 'interactive'){ - if (! exists($ENV{'form.mode'}) || $ENV{'form.mode'} ne 'edit') { + if ($env{'form.catalogmode'} eq 'interactive'){ + if (! exists($env{'form.mode'}) || $env{'form.mode'} ne 'edit') { $result.=< function select_data(title,url) { @@ -2910,10 +3051,10 @@ sub search_results_header { } SCRIPT - } elsif ($ENV{'form.mode'} eq 'edit') { - my $form = $ENV{'form.form'}; - my $element = $ENV{'form.element'}; - my $titleelement = $ENV{'form.titleelement'}; + } elsif ($env{'form.mode'} eq 'edit') { + my $form = $env{'form.form'}; + my $element = $env{'form.element'}; + my $titleelement = $env{'form.titleelement'}; my $changetitle; if (!$titleelement) { $changetitle='function changeTitle(val) {}'; @@ -2950,7 +3091,7 @@ function changeURL(val) { SCRIPT } } - $result.=< @@ -2989,8 +3130,11 @@ END ###################################################################### sub search_status_header { my $bodytag=&Apache::loncommon::bodytag(undef,undef,undef,1); + my $html=&Apache::lonxml::xmlbegin(); return <Search Status +$html + +Search Status $bodytag

Search Status

Sending search request to LON-CAPA servers.
@@ -2998,8 +3142,8 @@ ENDSTATUS } sub results_link { - my $basic_link = "/adm/searchcat?"."&table=".$ENV{'form.table'}. - "&persistent_db_id=".$ENV{'form.persistent_db_id'}; + my $basic_link = "/adm/searchcat?"."&table=".$env{'form.table'}. + "&persistent_db_id=".$env{'form.persistent_db_id'}; my $results_link = $basic_link."&phase=results". "&pause=1"."&start=1"; return $results_link; @@ -3009,12 +3153,13 @@ sub results_link { ###################################################################### sub print_frames_interface { my $r = shift; - my $basic_link = "/adm/searchcat?"."&table=".$ENV{'form.table'}. - "&persistent_db_id=".$ENV{'form.persistent_db_id'}; + my $basic_link = "/adm/searchcat?"."&table=".$env{'form.table'}. + "&persistent_db_id=".$env{'form.persistent_db_id'}; my $run_search_link = $basic_link."&phase=run_search"; my $results_link = &results_link(); + my $html=&Apache::lonxml::xmlbegin(); my $result = <<"ENDFRAMES"; - +$html