--- loncom/interface/lonsearchcat.pm 2005/01/19 20:22:36 1.230.2.1 +++ loncom/interface/lonsearchcat.pm 2004/09/23 21:16:45 1.233 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Search Catalog # -# $Id: lonsearchcat.pm,v 1.230.2.1 2005/01/19 20:22:36 albertel Exp $ +# $Id: lonsearchcat.pm,v 1.233 2004/09/23 21:16:45 matthew Exp $ # # Copyright Michigan State University Board of Trustees # @@ -76,6 +76,7 @@ use Apache::lonlocal; use LONCAPA::lonmetadata(); use HTML::Entities(); use Parse::RecDescent; +use Apache::lonnavmaps; ###################################################################### ###################################################################### @@ -444,18 +445,10 @@ sub hidden_field { { # Scope the course search to avoid global variables # # Variables For course search +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'); @@ -471,31 +464,105 @@ sub course_search { } } my $fulltext=$ENV{'form.crsfulltext'}; + my $discuss=$ENV{'form.crsdiscuss'}; my @allwords=($search_string,@New_Words); $totalfound=0; $r->print('LON-CAPA Course Search'. - $bodytag.'
'.$pretty_search_string.'

'); + $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", &GDBM_READER(),0640)) { - foreach (sort(keys(%hash))) { + foreach (keys %hash) { if ($c->aborted()) { last; } - 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); + if (($_=~/^src\_(.+)$/) && (!$alreadyseen{$hash{$_}})) { + &checkonthis($r,$hash{$_},0,$hash{'title_'.$1},$fulltext, + @allwords); } } untie(%hash); } unless ($totalfound) { - $r->print('

'.&mt('No resources found').'.

'); + $r->print('

'.&mt('No matches found in resources').'.

'); } + +# Check discussions if requested + if ($discuss) { + my $totaldiscussions = 0; + $r->print('

'.&mt('Discussion postings').':
'); + 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'}); + foreach my $resource (@allres) { + my $result = ''; + my $applies = 0; + my $symb = $resource->symb(); + my $ressymb = $symb; + if ($symb =~ m#(___adm/\w+/\w+)/(\d+)/bulletinboard$#) { + $ressymb = 'bulletin___'.$2.$1.'/'.$2.'/bulletinboard'; + unless ($ressymb =~ m#bulletin___\d+___adm/wrapper#) { + $ressymb=~s#(bulletin___\d+___)#$1adm/wrapper/#; + } + } + 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'}); + if ($contrib{'version'}) { + for (my $id=1;$id<=$contrib{'version'};$id++) { + unless (($contrib{'hidden'}=~/\.$id\./) || ($contrib{'deleted'}=~/\.$id\./)) { + if ($contrib{$id.':subject'}) { + $result .= $contrib{$id.':subject'}; + } + if ($contrib{$id.':message'}) { + $result .= $contrib{$id.':message'}; + } + if ($contrib{$id,':attachmenturl'}) { + if ($contrib{$id,':attachmenturl'} =~ m-/([^/]+)$-) { + $result .= $1; + } + } + $applies = &checkwords($result,$applies,@allwords); + } + } + } + } +# Does this discussion apply? + if ($applies) { + my ($map,$ind,$url)=&Apache::lonnet::decode_symb($ressymb); + my $disctype = &mt('resource'); + if ($url =~ m#/bulletinboard$#) { + if ($url =~m#^adm/wrapper/adm/.*/bulletinboard$#) { + $url =~s#^adm/wrapper##; + } + $disctype = &mt('bulletin board'); + } else { + $url = '/res/'.$url; + } + if ($url =~ /\?/) { + $url .= '&symb='; + } else { + $url .= '?symb='; + } + $url .= &Apache::lonnet::escape($resource->symb()); + my $title = $resource->compTitle(); + $r->print('
'. + ($title?$title:$url).'  - '.$disctype.'
'); + $totaldiscussions++; + } else { + $r->print(' .'); + } + } + unless ($totaldiscussions) { + $r->print('

'.&mt('No matches found in postings').'.

'); + } + } + # =================================================== Done going through course $r->print(''); } @@ -503,45 +570,27 @@ sub course_search { # =============================== This pulls up a resource and its dependencies sub checkonthis { - my ($r,$id,$url,$level,$title,$fulltext,$symb,@allwords)=@_; + my ($r,$url,$level,$title,$fulltext,@allwords)=@_; + $alreadyseen{$url}=1; $r->rflush(); - - 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)); + 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); } $result=~s/\s+/ /gs; - my $applies=0; - foreach (@allwords) { - if ($_=~/\w/) { - if ($result=~/$_/si) { - $applies++; - } - } - } + my $applies = 0; + $applies = &checkwords($result,$applies,@allwords); # Does this resource apply? if ($applies) { $r->print('
'); for (my $i=0;$i<=$level*5;$i++) { $r->print(' '); } - 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). - '
'); + $r->print(''. + ($title?$title:$url).'
'); $totalfound++; } elsif ($fulltext) { $r->print(' .'); @@ -551,12 +600,24 @@ sub checkonthis { my $dependencies= &Apache::lonnet::metadata($url,'dependencies'); foreach (split(/\,/,$dependencies)) { - if (($_=~/^\/res\//)) { - &checkonthis($r,$id,$_,$level+1,'',$fulltext,undef,@allwords); + if (($_=~/^\/res\//) && (!$alreadyseen{$_})) { + &checkonthis($r,$_,$level+1,'',$fulltext,@allwords); } } } +sub checkwords { + my ($result,$applies,@allwords) = @_; + foreach (@allwords) { + if ($_=~/\w/) { + if ($result=~/$_/si) { + $applies++; + } + } + } + return $applies; +} + sub untiehash { if (tied(%hash)) { untie(%hash); @@ -598,18 +659,18 @@ sub print_basic_search_form { my $scrout = &search_html_header().$bodytag; if (&Apache::lonnet::allowed('bre',$ENV{'request.role.domain'})) { # Define interface components - my $userelatedwords= + my $userelatedwords= ''; + my $onlysearchdomain=''; my $adv_search_link = ' 'use related words', - 'full' =>'fulltext search (time consuming)' + 'full' =>'fulltext search (time consuming)', + 'disc' => 'search discussion postings (resources and bulletin boards)', ); $scrout.=(< @@ -685,10 +747,14 @@ ENDCOURSESEARCH my $relcheckbox = &Apache::lonhtmlcommon::checkbox('crsrelated', $ENV{'form.crsrelated'}); + my $discheckbox = + &Apache::lonhtmlcommon::checkbox('crsdiscuss', + $ENV{'form.crsrelated'}); $scrout.=(< $relcheckbox $lt{'use'} $crscheckbox $lt{'full'} +$discheckbox $lt{'disc'}

 

@@ -2567,10 +2633,74 @@ sub display_results { &hidden_field('persistent_db_id'). &hidden_field('start') ); + # + # Build sorting selector + my @field_order = ('default', + 'title', + 'author', + 'subject', + 'url', + 'keywords', + 'version', + 'language', + 'creationdate'=>, + 'lastrevisiondate', + 'owner', + 'copyright', + 'authorspace', + 'lowestgradeleve', + 'highestgradelevel', + 'standards', + 'count', + 'stdno', + 'avetries', + 'difficulty', + 'disc', + 'clear', + 'technical', + 'correct', + 'helpful', + 'depth', + ); + my %sort_fields = ('default' => 'Default', + 'title' => 'Title', + 'author' => 'Author', + 'subject' => 'Subject', + 'url' => 'URL', + 'keywords' => 'Keywords', + 'version' => 'Version', + 'language' => 'Language', + 'creationdate'=> 'Creation Date', + 'lastrevisiondate' => 'Last Revision Date', + 'owner' => 'Owner', + 'copyright' => 'Copyright', + 'authorspace' => 'Authorspace', + 'lowestgradeleve' => 'Lowest Grade Level', + 'highestgradelevel' => 'Highest Grade Level', + 'standards' => 'Standards', + 'count' => 'Number of Accesses', + 'stdno' => 'Students Attempting', + 'avetries' => 'Average Number of Tries', + 'difficulty' => 'Mean Degree of Difficulty', + 'disc' => 'Mean Degree of Discrimination', + 'clear' => 'Evaluation: Clear', + 'technical' => 'Evaluation: Technically Correct', + 'correct' => 'Evaluation: Material is Correct', + 'helpful' => 'Evaluation: Material is Helpful', + 'depth' => 'Evaluation: Material has Depth', + 'select_form_order' => \@field_order, + ); + + my $sortform = &mt('Sort by [_1]', + &Apache::loncommon::select_form($ENV{'form.sortfield'}, + 'sortfield', + %sort_fields)); ## ## Output links (if necessary) for 'prev' and 'next' pages. $r->print - ('
'. + ('
'. + $sortform. + ''. &prev_next_buttons($min,$ENV{'form.show'},$total_results). ''. &viewoptions().'
' @@ -2581,13 +2711,21 @@ 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; + 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'}. + ' LIMIT '.($min-1).','.($max-$min); + } + my @Results = &Apache::lonmysql::get_rows($table,$sort_command); ## ## Loop through the results and output them. foreach my $row (@Results) {