Lines 48-57
use CGI qw('-no_undef_params');
Link Here
|
48 |
my $cgi = new CGI; |
48 |
my $cgi = new CGI; |
49 |
|
49 |
|
50 |
BEGIN { |
50 |
BEGIN { |
51 |
if (C4::Context->preference('BakerTaylorEnabled')) { |
51 |
if (C4::Context->preference('BakerTaylorEnabled')) { |
52 |
require C4::External::BakerTaylor; |
52 |
require C4::External::BakerTaylor; |
53 |
import C4::External::BakerTaylor qw(&image_url &link_url); |
53 |
import C4::External::BakerTaylor qw(&image_url &link_url); |
54 |
} |
54 |
} |
55 |
} |
55 |
} |
56 |
|
56 |
|
57 |
my ($template,$borrowernumber,$cookie); |
57 |
my ($template,$borrowernumber,$cookie); |
Lines 64-76
my @params = $cgi->param("limit");
Link Here
|
64 |
my $format = $cgi->param("format") || ''; |
64 |
my $format = $cgi->param("format") || ''; |
65 |
my $build_grouped_results = C4::Context->preference('OPACGroupResults'); |
65 |
my $build_grouped_results = C4::Context->preference('OPACGroupResults'); |
66 |
if ($format =~ /(rss|atom|opensearchdescription)/) { |
66 |
if ($format =~ /(rss|atom|opensearchdescription)/) { |
67 |
$template_name = 'opac-opensearch.tmpl'; |
67 |
$template_name = 'opac-opensearch.tmpl'; |
68 |
} |
68 |
} |
69 |
elsif (@params && $build_grouped_results) { |
69 |
elsif (@params && $build_grouped_results) { |
70 |
$template_name = 'opac-results-grouped.tmpl'; |
70 |
$template_name = 'opac-results-grouped.tmpl'; |
71 |
} |
71 |
} |
72 |
elsif ((@params>=1) || ($cgi->param("q")) || ($cgi->param('multibranchlimit')) || ($cgi->param('limit-yr')) ) { |
72 |
elsif ((@params>=1) || ($cgi->param("q")) || ($cgi->param('multibranchlimit')) || ($cgi->param('limit-yr')) ) { |
73 |
$template_name = 'opac-results.tmpl'; |
73 |
$template_name = 'opac-results.tmpl'; |
74 |
} |
74 |
} |
75 |
else { |
75 |
else { |
76 |
$template_name = 'opac-advsearch.tmpl'; |
76 |
$template_name = 'opac-advsearch.tmpl'; |
Lines 89-95
if ($template_name eq 'opac-results.tmpl') {
Link Here
|
89 |
} |
89 |
} |
90 |
|
90 |
|
91 |
if ($format eq 'rss2' or $format eq 'opensearchdescription' or $format eq 'atom') { |
91 |
if ($format eq 'rss2' or $format eq 'opensearchdescription' or $format eq 'atom') { |
92 |
$template->param($format => 1); |
92 |
$template->param($format => 1); |
93 |
$template->param(timestamp => strftime("%Y-%m-%dT%H:%M:%S-00:00", gmtime)) if ($format eq 'atom'); |
93 |
$template->param(timestamp => strftime("%Y-%m-%dT%H:%M:%S-00:00", gmtime)) if ($format eq 'atom'); |
94 |
# FIXME - the timestamp is a hack - the biblio update timestamp should be used for each |
94 |
# FIXME - the timestamp is a hack - the biblio update timestamp should be used for each |
95 |
# entry, but not sure if that's worth an extra database query for each bib |
95 |
# entry, but not sure if that's worth an extra database query for each bib |
Lines 104-121
$template->param( 'AllowOnShelfHolds' => C4::Context->preference('AllowOnShelfHo
Link Here
|
104 |
$template->param( 'OPACNoResultsFound' => C4::Context->preference('OPACNoResultsFound') ); |
104 |
$template->param( 'OPACNoResultsFound' => C4::Context->preference('OPACNoResultsFound') ); |
105 |
|
105 |
|
106 |
if (C4::Context->preference('BakerTaylorEnabled')) { |
106 |
if (C4::Context->preference('BakerTaylorEnabled')) { |
107 |
$template->param( |
107 |
$template->param( |
108 |
BakerTaylorEnabled => 1, |
108 |
BakerTaylorEnabled => 1, |
109 |
BakerTaylorImageURL => &image_url(), |
109 |
BakerTaylorImageURL => &image_url(), |
110 |
BakerTaylorLinkURL => &link_url(), |
110 |
BakerTaylorLinkURL => &link_url(), |
111 |
BakerTaylorBookstoreURL => C4::Context->preference('BakerTaylorBookstoreURL'), |
111 |
BakerTaylorBookstoreURL => C4::Context->preference('BakerTaylorBookstoreURL'), |
112 |
); |
112 |
); |
113 |
} |
113 |
} |
114 |
if (C4::Context->preference('TagsEnabled')) { |
114 |
if (C4::Context->preference('TagsEnabled')) { |
115 |
$template->param(TagsEnabled => 1); |
115 |
$template->param(TagsEnabled => 1); |
116 |
foreach (qw(TagsShowOnList TagsInputOnList)) { |
116 |
foreach (qw(TagsShowOnList TagsInputOnList)) { |
117 |
C4::Context->preference($_) and $template->param($_ => 1); |
117 |
C4::Context->preference($_) and $template->param($_ => 1); |
118 |
} |
118 |
} |
119 |
} |
119 |
} |
120 |
|
120 |
|
121 |
## URI Re-Writing |
121 |
## URI Re-Writing |
Lines 163-194
my $cnt;
Link Here
|
163 |
my $advanced_search_types = C4::Context->preference("AdvancedSearchTypes"); |
163 |
my $advanced_search_types = C4::Context->preference("AdvancedSearchTypes"); |
164 |
|
164 |
|
165 |
if (!$advanced_search_types or $advanced_search_types eq 'itemtypes') { |
165 |
if (!$advanced_search_types or $advanced_search_types eq 'itemtypes') { |
166 |
foreach my $thisitemtype ( sort {$itemtypes->{$a}->{'description'} cmp $itemtypes->{$b}->{'description'} } keys %$itemtypes ) { |
166 |
foreach my $thisitemtype ( sort {$itemtypes->{$a}->{'description'} cmp $itemtypes->{$b}->{'description'} } keys %$itemtypes ) { |
167 |
my %row =( number=>$cnt++, |
167 |
my %row =( number=>$cnt++, |
168 |
ccl => "$itype_or_itemtype,phr", |
168 |
ccl => "$itype_or_itemtype,phr", |
169 |
code => $thisitemtype, |
169 |
code => $thisitemtype, |
170 |
selected => $selected, |
170 |
selected => $selected, |
171 |
description => $itemtypes->{$thisitemtype}->{'description'}, |
171 |
description => $itemtypes->{$thisitemtype}->{'description'}, |
172 |
count5 => $cnt % 4, |
172 |
count5 => $cnt % 4, |
173 |
imageurl=> getitemtypeimagelocation( 'opac', $itemtypes->{$thisitemtype}->{'imageurl'} ), |
173 |
imageurl=> getitemtypeimagelocation( 'opac', $itemtypes->{$thisitemtype}->{'imageurl'} ), |
174 |
); |
174 |
); |
175 |
$selected = 0; # set to zero after first pass through |
175 |
$selected = 0; # set to zero after first pass through |
176 |
push @itemtypesloop, \%row; |
176 |
push @itemtypesloop, \%row; |
177 |
} |
177 |
} |
178 |
} else { |
178 |
} else { |
179 |
my $advsearchtypes = GetAuthorisedValues($advanced_search_types, '', 'opac'); |
179 |
my $advsearchtypes = GetAuthorisedValues($advanced_search_types, '', 'opac'); |
180 |
for my $thisitemtype (@$advsearchtypes) { |
180 |
for my $thisitemtype (@$advsearchtypes) { |
181 |
my %row =( |
181 |
my %row =( |
182 |
number=>$cnt++, |
182 |
number=>$cnt++, |
183 |
ccl => $advanced_search_types, |
183 |
ccl => $advanced_search_types, |
184 |
code => $thisitemtype->{authorised_value}, |
184 |
code => $thisitemtype->{authorised_value}, |
185 |
selected => $selected, |
185 |
selected => $selected, |
186 |
description => $thisitemtype->{'lib'}, |
186 |
description => $thisitemtype->{'lib'}, |
187 |
count5 => $cnt % 4, |
187 |
count5 => $cnt % 4, |
188 |
imageurl=> getitemtypeimagelocation( 'opac', $thisitemtype->{'imageurl'} ), |
188 |
imageurl=> getitemtypeimagelocation( 'opac', $thisitemtype->{'imageurl'} ), |
189 |
); |
189 |
); |
190 |
push @itemtypesloop, \%row; |
190 |
push @itemtypesloop, \%row; |
191 |
} |
191 |
} |
192 |
} |
192 |
} |
193 |
$template->param(itemtypeloop => \@itemtypesloop); |
193 |
$template->param(itemtypeloop => \@itemtypesloop); |
194 |
|
194 |
|
Lines 244-263
if ( $template_type && $template_type eq 'advsearch' ) {
Link Here
|
244 |
} |
244 |
} |
245 |
|
245 |
|
246 |
} |
246 |
} |
247 |
$template->param(uc(C4::Context->preference("marcflavour")) => 1, # we already did this for UNIMARC |
247 |
$template->param(uc( C4::Context->preference("marcflavour")) => 1, # we already did this for UNIMARC |
248 |
advsearch => 1, |
248 |
advsearch => 1, |
249 |
search_boxes_loop => \@search_boxes_array); |
249 |
search_boxes_loop => \@search_boxes_array); |
250 |
|
250 |
|
251 |
# use the global setting by default |
251 |
# use the global setting by default |
252 |
if ( C4::Context->preference("expandedSearchOption") == 1 ) { |
252 |
if ( C4::Context->preference("expandedSearchOption") == 1 ) { |
253 |
$template->param( expanded_options => C4::Context->preference("expandedSearchOption") ); |
253 |
$template->param( expanded_options => C4::Context->preference("expandedSearchOption") ); |
254 |
} |
254 |
} |
255 |
# but let the user override it |
255 |
# but let the user override it |
256 |
if (defined $cgi->param('expanded_options')) { |
256 |
if (defined $cgi->param('expanded_options')) { |
257 |
if ( ($cgi->param('expanded_options') == 0) || ($cgi->param('expanded_options') == 1 ) ) { |
257 |
if ( ($cgi->param('expanded_options') == 0) || ($cgi->param('expanded_options') == 1 ) ) { |
258 |
$template->param( expanded_options => $cgi->param('expanded_options')); |
258 |
$template->param( expanded_options => $cgi->param('expanded_options')); |
259 |
} |
|
|
260 |
} |
259 |
} |
|
|
260 |
} |
261 |
output_html_with_http_headers $cgi, $cookie, $template->output; |
261 |
output_html_with_http_headers $cgi, $cookie, $template->output; |
262 |
exit; |
262 |
exit; |
263 |
} |
263 |
} |
Lines 284-291
for (keys %$params) {
Link Here
|
284 |
$j++; |
284 |
$j++; |
285 |
} |
285 |
} |
286 |
} |
286 |
} |
287 |
# |
|
|
288 |
|
289 |
|
287 |
|
290 |
# Params that can have more than one value |
288 |
# Params that can have more than one value |
291 |
# sort by is used to sort the query |
289 |
# sort by is used to sort the query |
Lines 430-444
my $results_hashref;
Link Here
|
430 |
my @coins; |
428 |
my @coins; |
431 |
|
429 |
|
432 |
if ($tag) { |
430 |
if ($tag) { |
433 |
$query_cgi = "tag=" .$tag . "&" . $query_cgi; |
431 |
$query_cgi = "tag=" .$tag . "&" . $query_cgi; |
434 |
my $taglist = get_tags({term=>$tag, approved=>1}); |
432 |
my $taglist = get_tags({term=>$tag, approved=>1}); |
435 |
$results_hashref->{biblioserver}->{hits} = scalar (@$taglist); |
433 |
$results_hashref->{biblioserver}->{hits} = scalar (@$taglist); |
436 |
my @biblist = (map {GetBiblioData($_->{biblionumber})} @$taglist); |
434 |
my @biblist = (map {GetBiblioData($_->{biblionumber})} @$taglist); |
437 |
my @marclist = (map {$_->{marc}} @biblist ); |
435 |
my @marclist = (map {$_->{marc}} @biblist ); |
438 |
$DEBUG and printf STDERR "taglist (%s biblionumber)\nmarclist (%s records)\n", scalar(@$taglist), scalar(@marclist); |
436 |
$DEBUG and printf STDERR "taglist (%s biblionumber)\nmarclist (%s records)\n", scalar(@$taglist), scalar(@marclist); |
439 |
$results_hashref->{biblioserver}->{RECORDS} = \@marclist; |
437 |
$results_hashref->{biblioserver}->{RECORDS} = \@marclist; |
440 |
# FIXME: tag search and standard search should work together, not exclusively |
438 |
# FIXME: tag search and standard search should work together, not exclusively |
441 |
# FIXME: No facets for tags search. |
439 |
# FIXME: No facets for tags search. |
442 |
} |
440 |
} |
443 |
elsif (C4::Context->preference('NoZebra')) { |
441 |
elsif (C4::Context->preference('NoZebra')) { |
444 |
eval { |
442 |
eval { |
Lines 494-569
for (my $i=0;$i<@servers;$i++) {
Link Here
|
494 |
@newresults = searchResults('opac', $query_desc, $hits, $results_per_page, $offset, $scan, |
492 |
@newresults = searchResults('opac', $query_desc, $hits, $results_per_page, $offset, $scan, |
495 |
@{$results_hashref->{$server}->{"RECORDS"}},, C4::Context->preference('hidelostitems')); |
493 |
@{$results_hashref->{$server}->{"RECORDS"}},, C4::Context->preference('hidelostitems')); |
496 |
} |
494 |
} |
497 |
my $tag_quantity; |
495 |
|
498 |
if (C4::Context->preference('TagsEnabled') and |
496 |
# must define a value for size if not present in DB |
499 |
$tag_quantity = C4::Context->preference('TagsShowOnList')) { |
497 |
# in order to avoid problems generated by the default size value in TT |
500 |
foreach (@newresults) { |
498 |
foreach my $line (@newresults) { |
501 |
my $bibnum = $_->{biblionumber} or next; |
499 |
if ( not exists $line->{'size'} ) { $line->{'size'} = "" } |
502 |
$_->{itemsissued} = CountItemsIssued( $bibnum ); |
500 |
} |
503 |
$_ ->{'TagLoop'} = get_tags({biblionumber=>$bibnum, approved=>1, 'sort'=>'-weight', |
501 |
|
504 |
limit=>$tag_quantity }); |
502 |
my $tag_quantity; |
505 |
} |
503 |
if (C4::Context->preference('TagsEnabled') and |
506 |
} |
504 |
$tag_quantity = C4::Context->preference('TagsShowOnList')) { |
507 |
if (C4::Context->preference('COinSinOPACResults')) { |
505 |
foreach (@newresults) { |
508 |
foreach (@newresults) { |
506 |
my $bibnum = $_->{biblionumber} or next; |
509 |
my $record = GetMarcBiblio($_->{'biblionumber'}); |
507 |
$_->{itemsissued} = CountItemsIssued( $bibnum ); |
510 |
$_->{coins} = GetCOinSBiblio($record); |
508 |
$_ ->{'TagLoop'} = get_tags({biblionumber=>$bibnum, approved=>1, 'sort'=>'-weight', |
511 |
} |
509 |
limit=>$tag_quantity }); |
512 |
} |
510 |
} |
|
|
511 |
} |
512 |
if (C4::Context->preference('COinSinOPACResults')) { |
513 |
foreach (@newresults) { |
514 |
my $record = GetMarcBiblio($_->{'biblionumber'}); |
515 |
$_->{coins} = GetCOinSBiblio($record); |
516 |
} |
517 |
} |
513 |
|
518 |
|
514 |
if ($results_hashref->{$server}->{"hits"}){ |
519 |
if ($results_hashref->{$server}->{"hits"}){ |
515 |
$total = $total + $results_hashref->{$server}->{"hits"}; |
520 |
$total = $total + $results_hashref->{$server}->{"hits"}; |
516 |
} |
521 |
} |
517 |
# Opac search history |
522 |
|
518 |
my $newsearchcookie; |
523 |
# Opac search history |
519 |
if (C4::Context->preference('EnableOpacSearchHistory')) { |
524 |
my $newsearchcookie; |
520 |
my @recentSearches; |
525 |
if (C4::Context->preference('EnableOpacSearchHistory')) { |
521 |
|
526 |
my @recentSearches; |
522 |
# Getting the (maybe) already sent cookie |
527 |
|
523 |
my $searchcookie = $cgi->cookie('KohaOpacRecentSearches'); |
528 |
# Getting the (maybe) already sent cookie |
524 |
if ($searchcookie){ |
529 |
my $searchcookie = $cgi->cookie('KohaOpacRecentSearches'); |
525 |
$searchcookie = uri_unescape($searchcookie); |
530 |
if ($searchcookie){ |
526 |
if (thaw($searchcookie)) { |
531 |
$searchcookie = uri_unescape($searchcookie); |
527 |
@recentSearches = @{thaw($searchcookie)}; |
532 |
if (thaw($searchcookie)) { |
528 |
} |
533 |
@recentSearches = @{thaw($searchcookie)}; |
529 |
} |
534 |
} |
530 |
|
535 |
} |
531 |
# Adding the new search if needed |
536 |
|
532 |
if (!$borrowernumber || $borrowernumber eq '') { |
537 |
# Adding the new search if needed |
533 |
# To a cookie (the user is not logged in) |
538 |
if (!$borrowernumber || $borrowernumber eq '') { |
534 |
|
539 |
# To a cookie (the user is not logged in) |
535 |
if (($params->{'offset'}||'') eq '') { |
540 |
if (($params->{'offset'}||'') eq '') { |
536 |
|
541 |
push @recentSearches, { |
537 |
push @recentSearches, { |
542 |
"query_desc" => $query_desc || "unknown", |
538 |
"query_desc" => $query_desc || "unknown", |
543 |
"query_cgi" => $query_cgi || "unknown", |
539 |
"query_cgi" => $query_cgi || "unknown", |
544 |
"time" => time(), |
540 |
"time" => time(), |
545 |
"total" => $total |
541 |
"total" => $total |
546 |
}; |
542 |
}; |
547 |
$template->param(ShowOpacRecentSearchLink => 1); |
543 |
$template->param(ShowOpacRecentSearchLink => 1); |
548 |
} |
544 |
} |
549 |
|
545 |
|
550 |
shift @recentSearches if (@recentSearches > 15); |
546 |
shift @recentSearches if (@recentSearches > 15); |
551 |
# Pushing the cookie back |
547 |
# Pushing the cookie back |
552 |
$newsearchcookie = $cgi->cookie( |
548 |
$newsearchcookie = $cgi->cookie( |
553 |
-name => 'KohaOpacRecentSearches', |
549 |
-name => 'KohaOpacRecentSearches', |
554 |
# We uri_escape the whole freezed structure so we're sure we won't have any encoding problems |
550 |
# We uri_escape the whole freezed structure so we're sure we won't have any encoding problems |
555 |
-value => uri_escape(freeze(\@recentSearches)), |
551 |
-value => uri_escape(freeze(\@recentSearches)), |
556 |
-expires => '' |
552 |
-expires => '' |
557 |
); |
553 |
); |
558 |
$cookie = [$cookie, $newsearchcookie]; |
554 |
$cookie = [$cookie, $newsearchcookie]; |
559 |
} |
555 |
} |
560 |
else { |
556 |
else { |
561 |
# To the session (the user is logged in) |
557 |
# To the session (the user is logged in) |
562 |
if (($params->{'offset'}||'') eq '') { |
558 |
if (($params->{'offset'}||'') eq '') { |
563 |
AddSearchHistory($borrowernumber, $cgi->cookie("CGISESSID"), $query_desc, $query_cgi, $total); |
559 |
AddSearchHistory($borrowernumber, $cgi->cookie("CGISESSID"), $query_desc, $query_cgi, $total); |
564 |
$template->param(ShowOpacRecentSearchLink => 1); |
560 |
$template->param(ShowOpacRecentSearchLink => 1); |
565 |
} |
561 |
} |
566 |
} |
562 |
} |
567 |
} |
563 |
} |
568 |
## If there's just one result, redirect to the detail page |
564 |
## If there's just one result, redirect to the detail page |
|
|
565 |
if ($total == 1 && $format ne 'rss2' |
569 |
if ($total == 1 && $format ne 'rss2' |
566 |
&& $format ne 'opensearchdescription' && $format ne 'atom') { |
570 |
&& $format ne 'opensearchdescription' && $format ne 'atom') { |
567 |
my $biblionumber=$newresults[0]->{biblionumber}; |
571 |
my $biblionumber=$newresults[0]->{biblionumber}; |
568 |
if (C4::Context->preference('BiblioDefaultView') eq 'isbd') { |
572 |
if (C4::Context->preference('BiblioDefaultView') eq 'isbd') { |
569 |
print $cgi->redirect("/cgi-bin/koha/opac-ISBDdetail.pl?biblionumber=$biblionumber"); |
573 |
print $cgi->redirect("/cgi-bin/koha/opac-ISBDdetail.pl?biblionumber=$biblionumber"); |
Lines 668-674
for (my $i=0;$i<@servers;$i++) {
Link Here
|
668 |
$template->param( PAGE_NUMBERS => \@page_numbers, |
672 |
$template->param( PAGE_NUMBERS => \@page_numbers, |
669 |
previous_page_offset => $previous_page_offset) unless $pages < 2; |
673 |
previous_page_offset => $previous_page_offset) unless $pages < 2; |
670 |
$template->param(next_page_offset => $next_page_offset) unless $pages eq $current_page_number; |
674 |
$template->param(next_page_offset => $next_page_offset) unless $pages eq $current_page_number; |
671 |
} |
675 |
} |
672 |
# no hits |
676 |
# no hits |
673 |
else { |
677 |
else { |
674 |
$template->param(searchdesc => 1,query_desc => $query_desc,limit_desc => $limit_desc); |
678 |
$template->param(searchdesc => 1,query_desc => $query_desc,limit_desc => $limit_desc); |
Lines 699-705
$template->param(
Link Here
|
699 |
total => $total, |
703 |
total => $total, |
700 |
opacfacets => 1, |
704 |
opacfacets => 1, |
701 |
facets_loop => $facets, |
705 |
facets_loop => $facets, |
702 |
displayFacetCount=> C4::Context->preference('displayFacetCount')||0, |
706 |
displayFacetCount=> C4::Context->preference('displayFacetCount')||0, |
703 |
scan => $scan, |
707 |
scan => $scan, |
704 |
search_error => $error, |
708 |
search_error => $error, |
705 |
); |
709 |
); |
Lines 715-732
my @addpubshelves;
Link Here
|
715 |
my $pubshelves = $session->param('pubshelves'); |
719 |
my $pubshelves = $session->param('pubshelves'); |
716 |
my $barshelves = $session->param('barshelves'); |
720 |
my $barshelves = $session->param('barshelves'); |
717 |
foreach my $shelf (@$pubshelves) { |
721 |
foreach my $shelf (@$pubshelves) { |
718 |
next if ( ($shelf->{'owner'} != ($borrowernumber ? $borrowernumber : -1)) && ($shelf->{'category'} < 3) ); |
722 |
next if ( ($shelf->{'owner'} != ($borrowernumber ? $borrowernumber : -1)) && ($shelf->{'category'} < 3) ); |
719 |
push (@addpubshelves, $shelf); |
723 |
push (@addpubshelves, $shelf); |
720 |
} |
724 |
} |
721 |
|
725 |
|
722 |
if (@addpubshelves) { |
726 |
if (@addpubshelves) { |
723 |
$template->param( addpubshelves => scalar (@addpubshelves)); |
727 |
$template->param( addpubshelves => scalar (@addpubshelves)); |
724 |
$template->param( addpubshelvesloop => \@addpubshelves); |
728 |
$template->param( addpubshelvesloop => \@addpubshelves); |
725 |
} |
729 |
} |
726 |
|
730 |
|
727 |
if (defined $barshelves) { |
731 |
if (defined $barshelves) { |
728 |
$template->param( addbarshelves => scalar (@$barshelves)); |
732 |
$template->param( addbarshelves => scalar (@$barshelves)); |
729 |
$template->param( addbarshelvesloop => $barshelves); |
733 |
$template->param( addbarshelvesloop => $barshelves); |
730 |
} |
734 |
} |
731 |
|
735 |
|
732 |
my $content_type = ($format eq 'rss' or $format eq 'atom') ? $format : 'html'; |
736 |
my $content_type = ($format eq 'rss' or $format eq 'atom') ? $format : 'html'; |
733 |
- |
|
|