koha-cvs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Koha-cvs] koha/opac opac-zoomsearch.pl [dev_week]


From: Tumer Garip
Subject: [Koha-cvs] koha/opac opac-zoomsearch.pl [dev_week]
Date: Wed, 07 Jun 2006 16:52:06 +0000

CVSROOT:        /sources/koha
Module name:    koha
Branch:         dev_week
Changes by:     Tumer Garip <tgarip1957>        06/06/07 16:52:06

Modified files:
        opac           : opac-zoomsearch.pl 

Log message:
        Now shows the results on opac-results.tmpl
        Page navigation works but nothing else yet

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/koha/opac/opac-zoomsearch.pl?cvsroot=koha&only_with_tag=dev_week&r1=1.1.2.1&r2=1.1.2.2

Patches:
Index: opac-zoomsearch.pl
===================================================================
RCS file: /sources/koha/koha/opac/Attic/opac-zoomsearch.pl,v
retrieving revision 1.1.2.1
retrieving revision 1.1.2.2
diff -u -b -r1.1.2.1 -r1.1.2.2
--- opac-zoomsearch.pl  5 Jun 2006 13:11:01 -0000       1.1.2.1
+++ opac-zoomsearch.pl  7 Jun 2006 16:52:06 -0000       1.1.2.2
@@ -1,18 +1,20 @@
 #!/usr/bin/perl
-use strict; use warnings;
+use strict; 
 # load our Koha modules
 use C4::Context;
 use C4::Interface::CGI::Output;
 use C4::Auth;
-
+use POSIX qw(ceil floor);
 # load other modules
 use HTML::Template;
 use CGI;
 my $query=new CGI;
 my $op = $query->param('op'); #show the search form or execute the search
 my $query_form = $query->param('query_form'); # which query form was submitted
+my @newresults;
 my ($template,$borrowernumber,$cookie);
-
+my @forminputs;                #this is for the links to navigate among the 
results when they are more than the maximum number of results per page
+my @searchdesc;
 ## Check if we're searching
 if ($op eq 'get_results') { # Yea, we're searching, load the results template
        ($template, $borrowernumber, $cookie)
@@ -23,58 +25,113 @@
 
 my $number_of_results = $query->param('results_per_page');
 $number_of_results = 20 unless ($number_of_results); #this could be a 
parameter with 20 50 or 100 results per page
-my $offset=$query->param('offset');
-($offset) || ($offset=0);
-
+my $startfrom = $query->param('startfrom');
+       ($startfrom) || ($startfrom=0);
+# push @forminputs, {field => "results_per_page", value => 
$number_of_results};            
 ## OK, We're searching
 # STEP 1. We're a CGI script,so first thing to do is get the
 # query into PQF format so we can use the Koha API properly
 my $cql_query = $query->param('cql_query');
 my ($error,$pqf_sort_by, $pqf_prox_ops, $pqf_bool_ops, $pqf_query) = 
cgi2pqf($query);
 warn "AFTER CGI: $pqf_sort_by $pqf_prox_ops $pqf_bool_ops $pqf_query";
+push @forminputs, { field => "cql_query" , value => $cql_query} ;
+push @forminputs, {field => 'pqf_sort_by', value => $pqf_sort_by} ;
+push @forminputs, {field => 'pqf_prox_ops', value => $pqf_prox_ops};
+push @forminputs, { field => 'pqf_bool_ops' , value => $pqf_bool_ops};
+push @forminputs, { field => 'pqf_query' , value => $pqf_query };
 
 # STEP 2. OK, now we have PQF, so we can pass off the query to
 # the API
 my ($count, @results);
 if ($query->param('cql_query')) {
-       ($count,@results) = 
searchZOOM('cql',$cql_query,$number_of_results,$offset);
+       ($count,@results) = searchZOOM('cql',$cql_query);
 } else {
-       ($count,@results) = searchZOOM('pqf',"$pqf_sort_by $pqf_prox_ops 
$pqf_bool_ops $pqf_query",$number_of_results,$offset);
-}
-if ($count =~ /^error/) {
-       print $query->header();
-       print $count;
-       die;
-}
-
-print $query->header();
-print "Success:".$count;
-
-print "
-
-Resort by:
-<form action='/cgi-bin/koha/opac-zoomsearch.pl' method='get'>
-        <input type='hidden' name='query_form' value='pqf'/>
-        <input type='hidden' name='op' value='get_results'/>
-               <select name='pqf_query'>
-                       <option value='' selected>Relevance</option>
-                       <option value='address@hidden address@hidden 
address@hidden 7=1 address@hidden 1=4 0 address@hidden 7=2 address@hidden 1=30 
1 $pqf_prox_ops $pqf_bool_ops $pqf_query'>Title Ascending, Date 
Descending</option>
-                       <option value='address@hidden address@hidden 
address@hidden 7=1 address@hidden 1=1003 0 address@hidden 7=2 address@hidden 
1=30 1 $pqf_prox_ops $pqf_bool_ops $pqf_query'>Author Ascending, Date 
Descending</option>
-                       <option value='address@hidden address@hidden 
address@hidden 7=2 address@hidden 1=32 0 address@hidden 7=2 address@hidden 1=30 
1 $pqf_prox_ops $pqf_bool_ops $pqf_query'>Date of Acquisition, 
Relevance</option>
-                       <option value='address@hidden address@hidden 
address@hidden 7=2 address@hidden 1=30 0 address@hidden 7=2 address@hidden 1=4 
1 $pqf_prox_ops $pqf_bool_ops $pqf_query'>Date of Publication, 
Relevance</option>
-                               
-               </select>
-
-        <input type='submit' value='resort'/>
-</form>
-
-";
-my $c;
-foreach my $res (@results) {
-       $c++;
-       my $marc = MARC::Record->new_from_usmarc($res);
-       print "$c. ".$marc->title()."<br/><br/>";
+       ($count,@results) = searchZOOM('pqf',"$pqf_sort_by $pqf_prox_ops 
$pqf_bool_ops $pqf_query");
 }
+
+
+
address@hidden( $number_of_results,$count,$startfrom,@results) ;
+       my $num = scalar(@newresults);
+       # sorting out which results to display.
+       # the result number to start to show
+       $template->param(starting => $startfrom+1);
+       $template->param(ending => $startfrom+$number_of_results);
+       # the result number to end to show
+       ($startfrom+$num<=$count) ? ($template->param(endat => 
$startfrom+$num)) : ($template->param(endat => $count));
+       # the total results searched
+       $template->param(total => $count);
+       $template->param(FORMINPUTS => address@hidden);
+#      $template->param(searchdesc => address@hidden );
+       
+       $template->param(results_per_page =>  $number_of_results );
+       $template->param(SEARCH_RESULTS => address@hidden);
+
+       #this is to show the page numbers to navigate among the results, 
whether it has to show the number highlighted or not
+       my $numbers;
+       @$numbers = ();
+       my $pg = 1;
+       if (defined($query->param('pg'))) {
+               $pg = $query->param('pg');
+       }
+       my $start = 0;
+       
+       $start = ($pg - 1) * $number_of_results;
+       my $pages = ceil($count / $number_of_results);
+       my $total_pages = ceil($count / $number_of_results);
+       my $url;
+       if ($pg > 1) {
+                $url = $pg - 1;
+               push @$numbers, { number => "&lt;&lt;", 
+                                             highlight => 0 , 
+                                             startfrom => 0, 
+                                             pg => '1' };
+               push @$numbers, { number => "&lt;", 
+                                                 highlight => 0 , 
+                                                 startfrom => 
($url-1)*$number_of_results, 
+                                                 pg => $url };
+       }
+       my $current_ten = $pg / 10;
+       if ($current_ten == 0) {
+                $current_ten = 0.1;           # In case it´s in ten = 0
+       } 
+       my $from = $current_ten * 10; # Calculate the initial page
+       my $end_ten = $from + 9;
+       my $to;
+       if ($pages > $end_ten) {
+               $to = $end_ten;
+       } else {
+               $to = $pages;
+       }
+       for (my $i =$from; $i <= $to ; $i++) {
+               if ($i == $pg) {   
+                       if ($count > $number_of_results) {
+                               push @$numbers, { number => $i, 
+                                                                 highlight => 
1 , 
+                                                                 startfrom => 
($i-1)*$number_of_results , 
+                                                                 pg => $i };
+                       }
+               } else {
+                       push @$numbers, { number => $i, 
+                                                         highlight => 0 , 
+                                                         startfrom => 
($i-1)*$number_of_results , 
+                                                         pg => $i };
+               }
+       }                                                       
+       if ($pg < $pages) {
+                $url = $pg + 1;
+               push @$numbers, { number => "&gt;", 
+                                                 highlight => 0 , 
+                                                 startfrom => 
($url-1)*$number_of_results, 
+                                                 pg => $url };
+               push @$numbers, { number => "&gt;&gt;", 
+                                                 highlight => 0 , 
+                                                 startfrom => 
($total_pages-1)*$number_of_results, 
+                                                 pg => $total_pages};
+       }
+
+       $template->param(numbers => $numbers);
+
 } else {
 
 ($template, $borrowernumber, $cookie)
@@ -84,26 +141,26 @@
                     authnotrequired => 1,
                 });
 
-output_html_with_http_headers $query, $cookie, $template->output;
+
 }
+output_html_with_http_headers $query, $cookie, $template->output;
 
+###Move these subs to a proper Search.pm
 sub searchZOOM {
        use C4::Biblio;
-       my ($type,$query,$num,$offset) = @_;
+       my ($type,$query) = @_;
        my $dbh = C4::Context->dbh;
        my $zconn=C4::Context->Zconn("biblioserver");
 
        if ($zconn eq "error") {
                return("error with connection",undef); #FIXME: better error 
handling
        }
-       my $limit = $num + $offset;
-       my $startfrom = $offset;
 
-       my $zoom_query_obj;
 
+       my $zoom_query_obj;
        eval {
        if ($type eq 'cql') {
-               $zoom_query_obj = new ZOOM::Query::CQL2RPN($query,$zconn);
+               $zoom_query_obj = new ZOOM::Query::CQL($query,$zconn);
        } else {
                $zoom_query_obj = new ZOOM::Query::PQF($query);
        }
@@ -122,7 +179,7 @@
        }
        my $numresults = $result->size() if  ($result);
        my @results;
-       for (my $i=$startfrom; $i<=$limit;$i++) {
+       for (my $i=0; $i<$numresults;$i++) {
                my $rec = $result->record($i);
                push(@results,$rec->raw()) if $rec;
        }
@@ -132,7 +189,7 @@
 # build a valid PQF query from the CGI form
 sub cgi2pqf {
        my ($query) = @_;
-       
+warn "CGI 2 PQF conversion";   
        my @default_attributes = ('sort_by');
        # attributes specific to the advanced search - a search_point is 
actually a combination of
        #  several bib1 attributes
@@ -221,3 +278,151 @@
        warn "Full PQF: $pqf_sort_by $pqf_prox_ops $pqf_bool_ops $pqf_query";
        return ('',$pqf_sort_by, $pqf_prox_ops, $pqf_bool_ops, $pqf_query);
 }
+
+
+
+sub searchResults {
+my ($num,$numresults,$startfrom,@marcresults)address@hidden;   
+use C4::Date;
+
+my $dbh= C4::Context->dbh;
+my $toggle;
+my $even=1;
+my @newresults;
+#Build brancnames hash
+#find branchname
+#get branch information.....
+my %branches;
+               my $bsth=$dbh->prepare("SELECT branchcode,branchname FROM 
branches");
+               $bsth->execute();
+               while (my $bdata=$bsth->fetchrow_hashref){
+                       $branches{$bdata->{'branchcode'}}= 
$bdata->{'branchname'};
+
+               }
+
+
+
+#search item field code
+        my $sth =
+          $dbh->prepare(
+"select tagfield from marc_subfield_structure where kohafield like 
'items.itemnumber'"
+        );
+ $sth->execute;
+ my ($itemtag) = $sth->fetchrow;
+## find column names of items related to MARC
+my $sth2=$dbh->prepare("SHOW COLUMNS from items");
+       $sth2->execute;
+my %subfieldstosearch;
+while ((my $column)=$sth2->fetchrow){
+my ($tagfield,$tagsubfield) = 
&MARCfind_marc_from_kohafield($dbh,"items.".$column,"");
+$subfieldstosearch{$column}=$tagsubfield;
+}
+
+               for ( my $i=$startfrom; $i<(($startfrom+$num<=$numresults) ? 
($startfrom+$num):$numresults) ; $i++){
+       
+               my $marcrecord;                                 
+       $marcrecord = MARC::File::USMARC::decode($marcresults[$i]);
+       my $oldbiblio = MARCmarc2koha($dbh,$marcrecord,'');
+       if ($i % 2) {
+               $toggle="#ffffcc";
+       } else {
+               $toggle="white";
+       }
+       $oldbiblio->{'toggle'}=$toggle;
+
+       
+       
+ my @fields = $marcrecord->field($itemtag);
+my @items;
+ my $item;
+my %counts;
+$counts{'total'}=0;
+
+#      
+##Loop for each item field
+     foreach my $field (@fields) {
+       foreach my $code ( keys %subfieldstosearch ) {
+
+$item->{$code}=$field->subfield($subfieldstosearch{$code});
+}
+
+my $status;
+
+$item->{'branchname'}=$branches{$item->{'holdingbranch'}};
+
+$item->{'date_due'}=$item->{onloan};
+$status="Lost" if ($item->{itemlost});
+$status="Withdrawn" if ($item->{wthdrawn});
+
+ $status="Due:".format_date($item->{onloan}) if ($item->{onloan}>0 );
+
+# $status="On Loan" if ($item->{onloan} );
+if ($item->{'location'}){
+   $status = $item->{'branchname'}."[".$item->{'location'}."]" unless defined 
$status;
+}else{
+ $status = $item->{'branchname'} unless defined $status;
+}
+ $counts{$status}++;
+$counts{'total'}++;
+push @items,$item;
+       }
+               
+               my $norequests = 1;
+               my $noitems    = 1;
+               if (@items) {
+                       $noitems = 0;
+                       foreach my $itm (@items) {
+                               $norequests = 0 unless $itm->{'itemnotforloan'};
+                       }
+               }
+               $oldbiblio->{'noitems'} = $noitems;
+               $oldbiblio->{'norequests'} = $norequests;
+               $oldbiblio->{'even'} = $even = not $even;
+               $oldbiblio->{'itemcount'} = $counts{'total'};
+               
+               my $totalitemcounts = 0;
+               foreach my $key (keys %counts){
+                       if ($key ne 'total'){   
+                               $totalitemcounts+= $counts{$key};
+                               
$oldbiblio->{'locationhash'}->{$key}=$counts{$key};
+                       }
+               }
+               my ($locationtext, $locationtextonly, $notavailabletext) = 
('','','');
+               foreach (sort keys %{$oldbiblio->{'locationhash'}}) {
+                       if ($_ eq 'notavailable') {
+                               $notavailabletext="Not available";
+                               my $c=$oldbiblio->{'locationhash'}->{$_};
+                               $oldbiblio->{'not-available-p'}=$c;
+                       } else {
+                               $locationtext.="$_";
+                               my $c=$oldbiblio->{'locationhash'}->{$_};
+                               if ($_ eq 'Item Lost') {
+                                       $oldbiblio->{'lost-p'} = $c;
+                               } elsif ($_ eq 'Withdrawn') {
+                                       $oldbiblio->{'withdrawn-p'} = $c;
+                               } elsif ($_ eq 'On Loan') {
+                                       $oldbiblio->{'on-loan-p'} = $c;
+                               } else {
+                                       $locationtextonly.= $_;
+                                       $locationtextonly.= " ($c)<br> " if 
$totalitemcounts > 1;
+                               }
+                               if ($totalitemcounts>1) {
+                                       $locationtext.=" ($c)<br> ";
+                               }
+                       }
+               }
+               if ($notavailabletext) {
+                       $locationtext.= $notavailabletext;
+               } else {
+                       $locationtext=~s/, $//;
+               }
+               $oldbiblio->{'location'} = $locationtext;
+               $oldbiblio->{'location-only'} = $locationtextonly;
+               $oldbiblio->{'use-location-flags-p'} = 1;
+               
+
+       push (@newresults, $oldbiblio);
+
+               }
+return @newresults;
+       }
\ No newline at end of file




reply via email to

[Prev in Thread] Current Thread [Next in Thread]