X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;f=opac%2Fopac-search.pl;h=363a11ea0eaadbff48d6ed88a05467c9c2646d58;hb=afccbfcce7192c6e1fcd73f137135cb5289c3d3d;hp=46cf105cce8ce5bfb41f83371d61fd8119b929a2;hpb=15b7782234b926eb570ec79b58975d441083d55d;p=koha.git diff --git a/opac/opac-search.pl b/opac/opac-search.pl index 46cf105cce..363a11ea0e 100755 --- a/opac/opac-search.pl +++ b/opac/opac-search.pl @@ -63,6 +63,21 @@ my $DisplayMultiPlaceHold = C4::Context->preference("DisplayMultiPlaceHold"); use CGI qw('-no_undef_params'); my $cgi = new CGI; +my $branch_group_limit = $cgi->param("branch_group_limit"); +if ( $branch_group_limit ) { + if ( $branch_group_limit =~ /^multibranchlimit/ ) { + $cgi->param( + -name => 'multibranchlimit', + -values => [ ( split( 'multibranchlimit-', $branch_group_limit ) )[1] ] + ); + } else { + $cgi->append( + -name => 'limit', + -values => [ $branch_group_limit ] + ); + } +} + BEGIN { if (C4::Context->preference('BakerTaylorEnabled')) { require C4::External::BakerTaylor; @@ -71,12 +86,13 @@ BEGIN { } my ($template,$borrowernumber,$cookie); - +my $lang = C4::Templates::getlanguage($cgi, 'opac'); # decide which template to use my $template_name; my $template_type = 'basic'; my @params = $cgi->param("limit"); + my $format = $cgi->param("format") || ''; my $build_grouped_results = C4::Context->preference('OPACGroupResults'); if ($format =~ /(rss|atom|opensearchdescription)/) { @@ -178,7 +194,7 @@ $template->param( ); # load the language limits (for search) -my $languages_limit_loop = getAllLanguages(); +my $languages_limit_loop = getAllLanguages($lang); $template->param(search_languages_loop => $languages_limit_loop,); # load the Type stuff @@ -293,6 +309,11 @@ if ( $template_type && $template_type eq 'advsearch' ) { $template->param( expanded_options => $cgi->param('expanded_options')); } } + + if (C4::Context->preference('OPACNumbersPreferPhrase')) { + $template->param('numbersphr' => 1); + } + output_html_with_http_headers $cgi, $cookie, $template->output; exit; } @@ -312,7 +333,7 @@ $tag = $params->{tag} if $params->{tag}; my $pasarParams = ''; my $j = 0; for (keys %$params) { - my @pasarParam = split("\0", $params->{$_}); + my @pasarParam = $cgi->param($_); for my $paramValue(@pasarParam) { $pasarParams .= '&' if ($j > 0); $pasarParams .= $_ . '=' . $paramValue; @@ -333,7 +354,7 @@ if ( C4::Context->preference('OPACdefaultSortField') } my @allowed_sortby = qw /acqdate_asc acqdate_dsc author_az author_za call_number_asc call_number_dsc popularity_asc popularity_dsc pubdate_asc pubdate_dsc relevance title_az title_za/; -@sort_by = split("\0",$params->{'sort_by'}) if $params->{'sort_by'}; +@sort_by = $cgi->param('sort_by'); $sort_by[0] = $default_sort_by if !$sort_by[0] && defined($default_sort_by); foreach my $sort (@sort_by) { if ( $sort ~~ @allowed_sortby ) { @@ -343,8 +364,7 @@ foreach my $sort (@sort_by) { $template->param('sort_by' => $sort_by[0]); # Use the servers defined, or just search our local catalog(default) -my @servers; -@servers = split("\0",$params->{'server'}) if $params->{'server'}; +my @servers = $cgi->param('server'); unless (@servers) { #FIXME: this should be handled using Context.pm @servers = ("biblioserver"); @@ -353,30 +373,34 @@ unless (@servers) { # operators include boolean and proximity operators and are used # to evaluate multiple operands -my @operators; -@operators = split("\0",$params->{'op'}) if $params->{'op'}; +my @operators = $cgi->param('op'); +@operators = map { uri_unescape($_) } @operators; # indexes are query qualifiers, like 'title', 'author', etc. They # can be single or multiple parameters separated by comma: kw,right-Truncation -my @indexes; -@indexes = split("\0",$params->{'idx'}) if $params->{'idx'}; +my @indexes = $cgi->param('idx'); +@indexes = map { uri_unescape($_) } @indexes; # if a simple index (only one) display the index used in the top search box if ($indexes[0] && !$indexes[1]) { $template->param("ms_".$indexes[0] => 1); } # an operand can be a single term, a phrase, or a complete ccl query -my @operands; -@operands = split("\0",$params->{'q'}) if $params->{'q'}; +my @operands = $cgi->param('q'); +@operands = map { uri_unescape($_) } @operands; + +$template->{VARS}->{querystring} = join(' ', @operands); # if a simple search, display the value in the search box if ($operands[0] && !$operands[1]) { - $template->param(ms_value => $operands[0]); + my $ms_query = $operands[0]; + $ms_query =~ s/ #\S+//; + $template->param(ms_value => $ms_query); } # limits are use to limit to results to a pre-defined category such as branch or language -my @limits; -@limits = split("\0",$params->{'limit'}) if $params->{'limit'}; +my @limits = $cgi->param('limit'); +@limits = map { uri_unescape($_) } @limits; if($params->{'multibranchlimit'}) { push @limits, '('.join( " or ", map { "branch: $_ " } @{ GetBranchesInCategory( $params->{'multibranchlimit'} ) } ).')'; @@ -421,7 +445,6 @@ my ($error,$query,$simple_query,$query_cgi,$query_desc,$limit,$limit_cgi,$limit_ my @results; ## I. BUILD THE QUERY -my $lang = C4::Templates::getlanguage($cgi, 'opac'); ( $error,$query,$simple_query,$query_cgi,$query_desc,$limit,$limit_cgi,$limit_desc,$stopwords_removed,$query_type) = buildQuery(\@operators,\@operands,\@indexes,\@limits,\@sort_by, 0, $lang); sub _input_cgi_parse { @@ -482,11 +505,6 @@ if ($tag) { $results_hashref->{biblioserver}->{RECORDS} = \@marclist; # FIXME: tag search and standard search should work together, not exclusively # FIXME: No facets for tags search. -} -elsif (C4::Context->preference('NoZebra')) { - eval { - ($error, $results_hashref, $facets) = NZgetRecords($query,$simple_query,\@sort_by,\@servers,$results_per_page,$offset,$expanded_facet,$branches,$query_type,$scan); - }; } elsif ($build_grouped_results) { eval { ($error, $results_hashref, $facets) = C4::Search::pazGetRecords($query,$simple_query,\@sort_by,\@servers,$results_per_page,$offset,$expanded_facet,$branches,$query_type,$scan); @@ -497,7 +515,7 @@ elsif (C4::Context->preference('NoZebra')) { $pasarParams .= '&simple_query=' . $simple_query; $pasarParams .= '&query_type=' . $query_type if ($query_type); eval { - ($error, $results_hashref, $facets) = getRecords($query,$simple_query,\@sort_by,\@servers,$results_per_page,$offset,$expanded_facet,$branches,$itemtypes,$query_type,$scan); + ($error, $results_hashref, $facets) = getRecords($query,$simple_query,\@sort_by,\@servers,$results_per_page,$offset,$expanded_facet,$branches,$itemtypes,$query_type,$scan,1); }; } # This sorts the facets into alphabetical order @@ -634,7 +652,7 @@ for (my $i=0;$i<@servers;$i++) { $newsearchcookie = $cgi->cookie( -name => 'KohaOpacRecentSearches', # We uri_escape the whole freezed structure so we're sure we won't have any encoding problems - -value => uri_escape(freeze(\@recentSearches)), + -value =>freeze(\@recentSearches), -expires => '' ); $cookie = [$cookie, $newsearchcookie]; @@ -661,7 +679,7 @@ for (my $i=0;$i<@servers;$i++) { exit; } if ($hits) { - if (!C4::Context->preference('NoZebra') && !$build_grouped_results) { + if ( !$build_grouped_results ) { # We build the encrypted list of first OPACnumSearchResults biblios to pass with the search criteria for paging on opac-detail $pasarParams .= '&listBiblios='; my $j = 0; @@ -697,9 +715,45 @@ for (my $i=0;$i<@servers;$i++) { $template->param(results_per_page => $results_per_page); my $hide = C4::Context->preference('OpacHiddenItems'); $hide = ($hide =~ m/\S/) if $hide; # Just in case it has some spaces/new lines + my $branch = ''; + if (C4::Context->userenv){ + $branch = C4::Context->userenv->{branch}; + } + if ( C4::Context->preference('HighlightOwnItemsOnOPAC') ) { + if ( + ( ( C4::Context->preference('HighlightOwnItemsOnOPACWhich') eq 'PatronBranch' ) && $branch ) + || + C4::Context->preference('HighlightOwnItemsOnOPACWhich') eq 'OpacURLBranch' + ) { + my $branchname; + if ( C4::Context->preference('HighlightOwnItemsOnOPACWhich') eq 'PatronBranch' ) { + $branchname = $branches->{$branch}->{'branchname'}; + } + elsif ( C4::Context->preference('HighlightOwnItemsOnOPACWhich') eq 'OpacURLBranch' ) { + $branchname = $branches->{ $ENV{'BRANCHCODE'} }->{'branchname'}; + } + + foreach my $res ( @newresults ) { + my @new_loop; + my @top_loop; + my @old_loop = @{$res->{'available_items_loop'}}; + foreach my $item ( @old_loop ) { + if ( $item->{'branchname'} eq $branchname ) { + $item->{'this_branch'} = 1; + push( @top_loop, $item ); + } else { + push( @new_loop, $item ); + } + } + my @complete_loop = ( @top_loop, @new_loop ); + $res->{'available_items_loop'} = \@complete_loop; + } + } + } + $template->param( SEARCH_RESULTS => \@newresults, - OPACItemsResultsDisplay => (C4::Context->preference("OPACItemsResultsDisplay") eq "itemdetails"?1:0), + OPACItemsResultsDisplay => (C4::Context->preference("OPACItemsResultsDisplay")), suppress_result_number => $hide, ); if (C4::Context->preference("OPACLocalCoverImages")){ @@ -765,6 +819,16 @@ for (my $i=0;$i<@servers;$i++) { } # no hits else { + my $nohits = C4::Context->preference('OPACNoResultsFound'); + if ($nohits and $nohits=~/{QUERY_KW}/){ + # extracting keywords in case of relaunching search + (my $query_kw=$query_desc)=~s/ and|or / /g; + $query_kw = Encode::decode_utf8($query_kw); + my @query_kw=($query_kw=~ /([-\w]+\b)(?:[^,:]|$)/g); + $query_kw=join('+',@query_kw); + $nohits=~s/{QUERY_KW}/$query_kw/g; + $template->param('OPACNoResultsFound' =>$nohits); + } $template->param( searchdesc => 1, query_desc => $query_desc, @@ -826,5 +890,12 @@ if (C4::Context->preference('GoogleIndicTransliteration')) { $template->param('GoogleIndicTransliteration' => 1); } +$template->{VARS}->{DidYouMean} = + ( defined C4::Context->preference('OPACdidyoumean') + && C4::Context->preference('OPACdidyoumean') =~ m/enable/ ); +$template->{VARS}->{IDreamBooksReviews} = C4::Context->preference('IDreamBooksReviews'); +$template->{VARS}->{IDreamBooksReadometer} = C4::Context->preference('IDreamBooksReadometer'); +$template->{VARS}->{IDreamBooksResults} = C4::Context->preference('IDreamBooksResults'); + $template->param( borrowernumber => $borrowernumber); output_with_http_headers $cgi, $cookie, $template->output, $content_type;