X-Git-Url: http://koha-dev.rot13.org:8081/gitweb/?a=blobdiff_plain;f=serials%2Fsubscription-bib-search.pl;h=35159e6754f5e7e92174b98a1e86defd071da83f;hb=3c83e117869e501275fffc88ac10c9e1aee92160;hp=8f449290d0b160c610df629a626228a9ea0182fe;hpb=21a053217675c69f3c8e194a45e36f6b67cdbbd0;p=srvgit diff --git a/serials/subscription-bib-search.pl b/serials/subscription-bib-search.pl index 8f449290d0..35159e6754 100755 --- a/serials/subscription-bib-search.pl +++ b/serials/subscription-bib-search.pl @@ -2,170 +2,240 @@ # WARNING: 4-character tab stops here # Copyright 2000-2002 Katipo Communications +# Parts Copyright 2010 Biblibre # # This file is part of Koha. # -# Koha is free software; you can redistribute it and/or modify it under the -# terms of the GNU General Public License as published by the Free Software -# Foundation; either version 2 of the License, or (at your option) any later -# version. +# Koha is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. # -# Koha is distributed in the hope that it will be useful, but WITHOUT ANY -# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR -# A PARTICULAR PURPOSE. See the GNU General Public License for more details. +# Koha is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. # -# You should have received a copy of the GNU General Public License along with -# Koha; if not, write to the Free Software Foundation, Inc., 59 Temple Place, -# Suite 330, Boston, MA 02111-1307 USA +# You should have received a copy of the GNU General Public License +# along with Koha; if not, see . + +=head1 NAME + +subscription-bib-search.pl + +=head1 DESCRIPTION + +this script search among all existing subscriptions. + +=head1 PARAMETERS + +=over 4 + +=item op +op use to know the operation to do on this template. + * do_search : to search the subscription. + +Note that if op = do_search there are some others params specific to the search : + marclist,and_or,excluding,operator,value + +=item startfrom +to multipage gestion. + + +=back + +=cut use strict; +use warnings; -use CGI; +use CGI qw ( -utf8 ); use C4::Koha; use C4::Auth; use C4::Context; +use C4::Output; use C4::Search; -use C4::Auth; -use C4::Interface::CGI::Output; use C4::Biblio; -use C4::Acquisition; -use C4::Koha; # XXX subfield_is_koha_internal_p - +use C4::Debug; -# Creates a scrolling list with the associated default value. -# Using more than one scrolling list in a CGI assigns the same default value to all the -# scrolling lists on the page !?!? That's why this function was written. +use Koha::ItemTypes; +use Koha::SearchEngine; +use Koha::SearchEngine::Search; -my $query=new CGI; -my $type=$query->param('type'); -my $op = $query->param('op'); +my $input = new CGI; +my $op = $input->param('op') || q{}; my $dbh = C4::Context->dbh; -my $startfrom=$query->param('startfrom'); -$startfrom=0 if(!defined $startfrom); -my ($template, $loggedinuser, $cookie); +my $startfrom = $input->param('startfrom'); +$startfrom = 0 unless $startfrom; +my ( $template, $loggedinuser, $cookie ); my $resultsperpage; -if ($op eq "do_search") { - my @kohafield = $query->param('kohafield'); - my @and_or = $query->param('and_or'); - my @relation = $query->param('relation'); - my @value = $query->param('value'); - my $order=$query->param('order'); - $resultsperpage= $query->param('resultsperpage'); - $resultsperpage = 9 if(!defined $resultsperpage); - # builds tag and subfield arrays - - my ($total,$facets,@results) = ZEBRAsearch_kohafields(\@kohafield,\@value,\@relation,$order,\@and_or,1,"",$startfrom,$resultsperpage,"intranet"); - - ($template, $loggedinuser, $cookie) - = get_template_and_user({template_name => "serials/result.tmpl", - query => $query, - type => "intranet", - authnotrequired => 0, - flagsrequired => {borrowers => 1}, - flagsrequired => {catalogue => 1}, - debug => 1, - }); - - # multi page display gestion - my $displaynext=0; - my $displayprev=$startfrom; - if(($total - (($startfrom+1)*($resultsperpage))) > 0 ){ - $displaynext = 1; - } - - my @field_data = (); - - - for(my $i = 0 ; $i <= $#value ; $i++) - { - push @field_data, { term => "kohafield", val=>$kohafield[$i] }; - push @field_data, { term => "and_or", val=>$and_or[$i] }; - push @field_data, { term => "relation", val=>$relation[$i] }; - push @field_data, { term => "value", val=>$value[$i] }; - } - - my @numbers = (); - - if ($total>$resultsperpage) - { - for (my $i=1; $i<$total/$resultsperpage+1; $i++) - { - if ($i<16) - { - my $highlight=0; - ($startfrom==($i-1)) && ($highlight=1); - push @numbers, { number => $i, - highlight => $highlight , - searchdata=> \@field_data, - startfrom => ($i-1)}; - } - } - } - - my $from = $startfrom*$resultsperpage+1; - my $to; - - if($total < (($startfrom+1)*$resultsperpage)) - { - $to = $total; - } else { - $to = (($startfrom+1)*$resultsperpage); - } - $template->param(result => \@results, - startfrom=> $startfrom, - displaynext=> $displaynext, - displayprev=> $displayprev, - resultsperpage => $resultsperpage, - startfromnext => $startfrom+1, - startfromprev => $startfrom-1, - searchdata=>\@field_data, - total=>$total, - from=>$from, - to=>$to, - numbers=>\@numbers, - ); -} else { - ($template, $loggedinuser, $cookie) - = get_template_and_user({template_name => "serials/subscription-bib-search.tmpl", - query => $query, - type => "intranet", - authnotrequired => 0, - flagsrequired => {catalogue => 1}, - debug => 1, - }); - my $sth=$dbh->prepare("Select itemtype,description from itemtypes order by description"); - $sth->execute; - my @itemtype; - my %itemtypes; - push @itemtype, ""; - $itemtypes{''} = ""; - while (my ($value,$lib) = $sth->fetchrow_array) { - push @itemtype, $value; - $itemtypes{$value}=$lib; - } - - my $CGIitemtype=CGI::scrolling_list( -name => 'value', - -values => \@itemtype, - -labels => \%itemtypes, - -size => 1, - -tabindex=>'', - -multiple => 0 ); - $sth->finish; - - $template->param( - CGIitemtype => $CGIitemtype, - ); +my $itype_or_itemtype = + ( C4::Context->preference("item-level_itypes") ) ? 'itype' : 'itemtype'; + +my $query = $input->param('q'); + +# don't run the search if no search term ! +if ( $op eq "do_search" && $query ) { + + ( $template, $loggedinuser, $cookie ) = get_template_and_user( + { + template_name => "serials/result.tt", + query => $input, + type => "intranet", + authnotrequired => 0, + flagsrequired => { catalogue => 1, serials => '*' }, + debug => 1, + } + ); + + # add the limits if applicable + my $itemtypelimit = $input->param('itemtypelimit'); + my $ccodelimit = $input->param('ccodelimit'); + my $op = C4::Context->preference('UseQueryParser') ? '&&' : 'and'; + $query .= " $op $itype_or_itemtype:$itemtypelimit" if $itemtypelimit; + $query .= " $op ccode:$ccodelimit" if $ccodelimit; + $debug && warn $query; + $resultsperpage = $input->param('resultsperpage'); + $resultsperpage = 20 if ( !defined $resultsperpage ); + + my $searcher = Koha::SearchEngine::Search->new({index => $Koha::SearchEngine::BIBLIOS_INDEX}); + my ( $error, $marcrecords, $total_hits ) = + $searcher->simple_search_compat( $query, $startfrom * $resultsperpage, $resultsperpage ); + my $total = 0; + if ( defined $marcrecords ) { + $total = scalar @{$marcrecords}; + } + + if ( defined $error ) { + $template->param( query_error => $error ); + warn "error: " . $error; + output_html_with_http_headers $input, $cookie, $template->output; + exit; + } + my @results; + + for ( my $i = 0 ; $i < $total ; $i++ ) { + my %resultsloop; + my $marcrecord = C4::Search::new_record_from_zebra( 'biblioserver', $marcrecords->[$i] ); + my $biblio = TransformMarcToKoha( $marcrecord, '' ); + + #build the hash for the template. + $resultsloop{highlight} = ( $i % 2 ) ? (1) : (0); + $resultsloop{title} = $biblio->{'title'}; + $resultsloop{subtitle} = $biblio->{'subtitle'}; + $resultsloop{biblionumber} = $biblio->{'biblionumber'}; + $resultsloop{author} = $biblio->{'author'}; + $resultsloop{publishercode} = $biblio->{'publishercode'}; + $resultsloop{publicationyear} = $biblio->{'publicationyear'}; + $resultsloop{issn} = $biblio->{'issn'}; + + push @results, \%resultsloop; + } + + # multi page display gestion + my $displaynext = 0; + my $displayprev = $startfrom; + if ( ( $total_hits - ( ( $startfrom + 1 ) * ($resultsperpage) ) ) > 0 ) { + $displaynext = 1; + } + + my @numbers = (); + + if ( $total_hits > $resultsperpage ) { + for ( my $i = 1 ; $i < $total / $resultsperpage + 1 ; $i++ ) { + if ( $i < 16 ) { + my $highlight = 0; + ( $startfrom == ( $i - 1 ) ) && ( $highlight = 1 ); + push @numbers, + { + number => $i, + highlight => $highlight, + searchdata => \@results, + startfrom => ( $i - 1 ) + }; + } + } + } + + my $from = 0; + $from = $startfrom * $resultsperpage + 1 if ( $total_hits > 0 ); + my $to; + + if ( $total_hits < ( ( $startfrom + 1 ) * $resultsperpage ) ) { + $to = $total; + } + else { + $to = ( ( $startfrom + 1 ) * $resultsperpage ); + } + $template->param( + query => $query, + resultsloop => \@results, + startfrom => $startfrom, + displaynext => $displaynext, + displayprev => $displayprev, + resultsperpage => $resultsperpage, + startfromnext => $startfrom + 1, + startfromprev => $startfrom - 1, + total => $total_hits, + from => $from, + to => $to, + numbers => \@numbers, + ); +} # end of if ($op eq "do_search" & $query) +else { + ( $template, $loggedinuser, $cookie ) = get_template_and_user( + { + template_name => "serials/subscription-bib-search.tt", + query => $input, + type => "intranet", + authnotrequired => 0, + flagsrequired => { catalogue => 1, serials => '*' }, + debug => 1, + } + ); + + # load the itemtypes + my $itemtypes = { map { $_->{itemtype} => $_ } @{ Koha::ItemTypes->search_with_localization->unblessed } }; + my @itemtypesloop; + # FIXME This is uselessly complex, the iterator should be send to the template + # FIXME The translated_description should be used + foreach my $thisitemtype ( + sort { + $itemtypes->{$a}->{'description'} + cmp $itemtypes->{$b}->{'description'} + } keys %$itemtypes + ) + { + my %row = ( + code => $thisitemtype, + description => $itemtypes->{$thisitemtype}->{'description'}, + ); + push @itemtypesloop, \%row; + } + + # load Collection Codes + my $authvalues = GetAuthorisedValues('CCODE'); + my @ccodesloop; + for my $thisauthvalue ( sort { $a->{'lib'} cmp $b->{'lib'} } @$authvalues ) + { + my %row = ( + code => $thisauthvalue->{'authorised_value'}, + description => $thisauthvalue->{'lib'}, + ); + push @ccodesloop, \%row; + } + + $template->param( + itemtypeloop => \@itemtypesloop, + ccodeloop => \@ccodesloop, + no_query => $op eq "do_search" ? 1 : 0, + ); } - # Print the page -$template->param(intranetcolorstylesheet => C4::Context->preference("intranetcolorstylesheet"), - intranetstylesheet => C4::Context->preference("intranetstylesheet"), - IntranetNav => C4::Context->preference("IntranetNav"), - ); -output_html_with_http_headers $query, $cookie, $template->output; +output_html_with_http_headers $input, $cookie, $template->output; # Local Variables: # tab-width: 4