Diff for /loncom/interface/lonsearchcat.pm between versions 1.326 and 1.327

version 1.326, 2010/08/25 12:38:45 version 1.327, 2011/01/17 20:18:02
Line 173  sub handler { Line 173  sub handler {
     if (&Apache::lonnet::allowed('bre',$env{'request.role.domain'})) {      if (&Apache::lonnet::allowed('bre',$env{'request.role.domain'})) {
         push(@allowed_searches,'res');          push(@allowed_searches,'res');
     }       } 
     if (exists($env{'request.course.id'}) && $env{'request.course.id'} ne '') {  
         push(@allowed_searches,'course');  
     }  
     my $crumb_text = 'Portfolio Search';      my $crumb_text = 'Portfolio Search';
     if (@allowed_searches == 3) {      if (@allowed_searches ==2) {
         $crumb_text = 'Course, Portfolio and Catalog Search';         $crumb_text = 'Portfolio and Catalog Search'; 
     } elsif (@allowed_searches ==2) {  
         if (grep(/^res$/,@allowed_searches)) {  
             $crumb_text = 'Portfolio and Catalog Search';   
         } elsif (grep(/^course$/,@allowed_searches)) {  
             $crumb_text = 'Portfolio and Course Search';  
         }  
     }      }
     &Apache::lonhtmlcommon::add_breadcrumb      &Apache::lonhtmlcommon::add_breadcrumb
        ({href=>'/adm/searchcat?'.         ({href=>'/adm/searchcat?'.
Line 301  END Line 292  END
     if ($env{'form.phase'} eq 'adv_search' ||      if ($env{'form.phase'} eq 'adv_search' ||
         $env{'form.phase'} eq 'disp_adv') {          $env{'form.phase'} eq 'disp_adv') {
         $env{'form.searchmode'} = 'advanced';          $env{'form.searchmode'} = 'advanced';
     } elsif ($env{'form.phase'} eq 'course_search') {  
         $env{'form.searchmode'} = 'course_search';  
     }      }
     #      #
     if ($env{'form.searchmode'} eq 'advanced') {      if ($env{'form.searchmode'} eq 'advanced') {
Line 318  END Line 307  END
                   '&mode='.$env{'form.mode'},                    '&mode='.$env{'form.mode'},
                   text=>"Advanced $srchtype Search",                    text=>"Advanced $srchtype Search",
                   bug=>'Searching',});                    bug=>'Searching',});
     } elsif ($env{'form.searchmode'} eq 'course search') {      } 
         &Apache::lonhtmlcommon::add_breadcrumb  
             ({href=>'/adm/searchcat?'.&Apache::loncommon::inhibit_menu_check().  
                   '&phase=disp_adv'.  
                   '&catalogmode='.$env{'form.catalogmode'}.  
                   '&launch='.$env{'form.launch'}.  
                   '&mode='.$env{'form.mode'},  
                   text=>"Course Search",  
                   bug=>'Searching',});  
     }  
     ##      ##
     ## Switch on the phase      ## Switch on the phase
     ##      ##
Line 349  END Line 329  END
             &run_search($r,$query,$customquery,$customshow,              &run_search($r,$query,$customquery,$customshow,
                         $libraries,$pretty_string,$env{'form.area'});                          $libraries,$pretty_string,$env{'form.area'});
         }          }
     } elsif ($env{'form.phase'} eq 'course_search') {  
         &course_search($r);  
     } elsif(($env{'form.phase'} eq 'basic_search') ||      } elsif(($env{'form.phase'} eq 'basic_search') ||
             ($env{'form.phase'} eq 'adv_search')) {              ($env{'form.phase'} eq 'adv_search')) {
         #          #
Line 446  sub hidden_field { Line 424  sub hidden_field {
 }  }
   
 ######################################################################  ######################################################################
 ######################################################################  
 ##  
 ##   Course Search  
 ##  
 ######################################################################  
 ######################################################################  
 {   # 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 $pretty_search_string = '<b>'.$env{'form.courseexp'}.'</b>';  
     my $search_string = $env{'form.courseexp'};  
     my @New_Words;  
     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").": <b>@New_Words</b>.";  
         } else {  
             $pretty_search_string .= ' '.&mt('with no related words').".";  
         }  
     }  
     my $fulltext=$env{'form.crsfulltext'};  
     my $discuss=$env{'form.crsdiscuss'};  
     my @allwords=($search_string,@New_Words);  
     $totalfound=0;  
   
     &Apache::lonhtmlcommon::add_breadcrumb  
         ({href=>'/adm/searchcat?'.&Apache::loncommon::inhibit_menu_check().  
               '&amp;phase=disp_adv'.  
               '&amp;catalogmode='.$env{'form.catalogmode'}.  
               '&amp;launch='.$env{'form.launch'}.  
               '&amp;mode='.$env{'form.mode'},  
               text=>"Course Search",  
               bug=>'Searching',});  
     $r->print(&Apache::loncommon::start_page('Course Search'));  
     $r->print(&Apache::lonhtmlcommon::breadcrumbs('Searching','Searching',  
                         $env{'form.catalogmode'} ne 'import'));  
   
     $r->print(  
       '<hr /><center><font size="+2" face="arial">'.  
       $pretty_search_string.'</font></center>'.  
       '<hr /><b>'.&mt('Course content').':</b><br />');  
     $r->rflush();  
 # ======================================================= Go through the course  
     my $c=$r->connection;  
     if (tie(%hash,'GDBM_File',$env{'request.course.fn'}.".db",  
             &GDBM_READER(),0640)) {  
         foreach (sort(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);  
             }  
         }  
         untie(%hash);  
     }  
     unless ($totalfound) {  
  $r->print('<p class="LC_info">'.&mt('No matches found in resources.').'</p>');  
     }  
   
 # Check discussions if requested  
     if ($discuss) {  
         my $totaldiscussions = 0;  
         $r->print('<br /><br /><b>'.&mt('Discussion postings').':</b><br />');   
         my $navmap = Apache::lonnavmaps::navmap->new();  
         if (defined($navmap)) {  
             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/$LONCAPA::domain_re/$LONCAPA::username_re)/(\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('discussion board');  
                     } else {  
                         $url = '/res/'.$url;  
                     }  
                     if ($url =~ /\?/) {  
                         $url .= '&amp;symb=';  
                     } else {  
                         $url .= '?symb=';  
                     }  
                     $url .= &escape($resource->symb());  
                     my $title = $resource->compTitle();  
                     $r->print('<br /><a href="'.$url.'" target="cat">'.  
                          ($title?$title:$url).'</a>&nbsp;&nbsp;-&nbsp;'.  
                          $disctype.'<br />');  
                     $totaldiscussions++;  
                 } else {  
                     $r->print(' .');  
                 }  
             }  
             unless ($totaldiscussions) {  
                 $r->print('<p class="LC_info">'.&mt('No matches found in postings.').'</p>');  
             }  
         } else {  
             $r->print('<div class="LC_error">'.&mt('An error occurred retrieving information about resources in the course.').'<br />'.&mt('It is recommended that you [_1]re-initialize the course[_2] and then try your search again.','<a href="/adm/roles">','</a>').'</div>');  
         }  
     }  
    
 # =================================================== Done going through course  
     $r->print(&Apache::loncommon::end_page());  
 }  
   
 # =============================== This pulls up a resource and its dependencies  
   
 sub checkonthis {  
     my ($r,$id,$url,$level,$title,$fulltext,$symb,@allwords)=@_;  
     $alreadyseen{$id}=1;  
     if (&Apache::loncommon::connection_aborted($r)) { return; }  
     $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='.&escape($symb));  
     }  
     $result=~s/\s+/ /gs;  
     my $applies = 0;  
     $applies = &checkwords($result,$applies,@allwords);  
 # Does this resource apply?  
     if ($applies) {  
        $r->print('<br />');  
        for (my $i=0;$i<=$level*5;$i++) {  
            $r->print('&nbsp;');  
        }  
        my $href=$url;  
        if ($hash{'encrypted_'.$id} && !$env{'request.role.adv'}) {  
    $href=&Apache::lonenc::encrypted($href)  
        .'?symb='.&Apache::lonenc::encrypted($symb);  
        } else {  
    $href.='?symb='.&escape($symb);  
        }  
        $r->print('<a href="'.$href.'" target="cat">'.($title?$title:$url).  
  '</a><br />');  
        $totalfound++;  
     } elsif ($fulltext) {  
        $r->print(' .');  
     }  
     $r->rflush();  
 # Check also the dependencies of this one  
     my $dependencies=  
                 &Apache::lonnet::metadata($url,'dependencies');  
     foreach (split(/\,/,$dependencies)) {  
        if (($_=~/^\/res\//) && (!$alreadyseen{$id})) {   
           &checkonthis($r,$id,$_,$level+1,'',$fulltext,undef,@allwords);  
        }  
     }  
 }  
   
 sub checkwords {  
     my ($result,$applies,@allwords) = @_;  
     foreach (@allwords) {  
         if ($_=~/\w/) {  
             if ($result=~/$_/si) {  
                 $applies++;  
             }  
         }  
     }  
     return $applies;  
 }  
   
 sub untiehash {  
     if (tied(%hash)) {  
         untie(%hash);  
     }  
 }  
   
 } # End of course search scoping  
   
   
 ######################################################################  
 ######################################################################  
   
 =pod   =pod 
   
Line 709  sub print_basic_search_form { Line 449  sub print_basic_search_form {
     }      }
 # Search form for accessible portfolio files  # Search form for accessible portfolio files
     $scrout.= &setup_basic_search($r,'portfolio',$hidden_fields,$closebutton);      $scrout.= &setup_basic_search($r,'portfolio',$hidden_fields,$closebutton);
     if ($env{'request.course.id'}) {  
  my %lt=&Apache::lonlocal::texthash('srch' => 'Search',  
                                            'header' => 'Course Search',  
  'note' => 'Enter terms or phrases, then press "Search" below',  
  'use' => 'use related words',  
  'full' =>'fulltext search (time consuming)',  
          'disc' => 'search discussion postings (resources and discussion boards)',  
    );  
         $scrout.=(<<ENDCOURSESEARCH);  
 <form name="loncapa_search" method="post" action="/adm/searchcat">  
 <center>  
 <hr />  
 <h1>$lt{'header'}</h1>      
 <input type="hidden" name="phase" value="course_search" />  
 $hidden_fields  
 <p>  
 $lt{'note'}.  
 </p>  
 <table>  
 <tr><td>  
 ENDCOURSESEARCH  
         $scrout.='&nbsp;'.  
             &Apache::lonhtmlcommon::textbox('courseexp',  
                                   $env{'form.courseexp'},40);  
         my $crscheckbox =   
             &Apache::lonhtmlcommon::checkbox('crsfulltext',  
                                    $env{'form.crsfulltext'});  
         my $relcheckbox =   
             &Apache::lonhtmlcommon::checkbox('crsrelated',  
    $env{'form.crsrelated'});  
         my $discheckbox =   
             &Apache::lonhtmlcommon::checkbox('crsdiscuss',  
                                    $env{'form.crsrelated'});  
         $scrout.=(<<ENDENDCOURSE);  
 </td></tr>  
 <tr><td><label>$relcheckbox $lt{'use'}</label></td><td></td></tr>  
 <tr><td><label>$crscheckbox $lt{'full'}</label></td><td></td></tr>  
 <tr><td><label>$discheckbox $lt{'disc'}</label></td><td></td></tr>  
 </table>  
 <p>  
 <input type="submit" name="coursesubmit" value='$lt{'srch'}' />  
 </p>  
 </center>  
 </form>  
 ENDENDCOURSE  
     }  
     $scrout .= &Apache::loncommon::end_page();      $scrout .= &Apache::loncommon::end_page();
     $r->print($scrout);      $r->print($scrout);
     return;      return;

Removed from v.1.326  
changed lines
  Added in v.1.327


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>