Bug 20310: Redirect article record without items for article requests
[koha-ffzg.git] / opac / opac-search.pl
index dd0d488..cde8b6e 100755 (executable)
@@ -30,7 +30,6 @@ use Modern::Perl;
 use C4::Context;
 use List::MoreUtils q/any/;
 use Try::Tiny;
-use YAML::XS;
 use Encode;
 
 use Data::Dumper; # TODO remove
@@ -106,7 +105,7 @@ my $format = $cgi->param("format") || '';
 if ($format =~ /(rss|atom|opensearchdescription)/) {
     $template_name = 'opac-opensearch.tt';
 }
-elsif ((@params>=1) || ($cgi->param("q")) || ($cgi->param('multibranchlimit')) || ($cgi->param('limit-yr')) || @searchCategories ) {
+elsif ((@params>=1) || (defined $cgi->param("q") && $cgi->param("q") ne "") || ($cgi->param('multibranchlimit')) || ($cgi->param('limit-yr')) || @searchCategories ) {
     $template_name = 'opac-results.tt';
 }
 else {
@@ -242,17 +241,7 @@ my $cnt;
 my $advanced_search_types = C4::Context->preference("AdvancedSearchTypes") || "itemtypes";
 my @advanced_search_types = split(/\|/, $advanced_search_types);
 
-my $hidingrules = {};
-my $yaml = C4::Context->preference('OpacHiddenItems');
-if ( $yaml =~ /\S/ ) {
-    $yaml = "$yaml\n\n"; # YAML expects trailing newline. Surplus does not hurt.
-    eval {
-        $hidingrules = YAML::XS::Load(Encode::encode_utf8($yaml));
-    };
-    if ($@) {
-        warn "Unable to parse OpacHiddenItems syspref : $@";
-    }
-}
+my $hidingrules = C4::Context->yaml_preference('OpacHiddenItems') // {};
 
 my @sorted_itemtypes = sort { $itemtypes->{$a}->{translated_description} cmp $itemtypes->{$b}->{translated_description} } keys %$itemtypes;
 foreach my $advanced_srch_type (@advanced_search_types) {
@@ -495,11 +484,44 @@ if (@searchCategories > 0) {
 
 @limits = map { uri_unescape($_) } @limits;
 
-if($params->{'multibranchlimit'}) {
+if ( $params->{'multibranchlimit'} || ( $branch_group_limit && $branch_group_limit =~ /^multibranchlimit-/ ) ) {
+    my $branchfield  = C4::Context->preference('SearchLimitLibrary');
     my $search_group = Koha::Library::Groups->find( $params->{multibranchlimit} );
-    my @libraries = $search_group->all_libraries;
-    my $multibranch = '('.join( " OR ", map { 'homebranch: ' . $_->branchcode } @libraries ) .')';
-    push @limits, $multibranch if ($multibranch ne  '()');
+
+    my @branchcodes  = map { $_->branchcode } $search_group->all_libraries;
+
+    if (@branchcodes) {
+        if ( $branchfield eq "homebranch" ) {
+            push @limits, sprintf "(%s)", join " or ", map { 'homebranch: ' . $_ } @branchcodes;
+        }
+        elsif ( $branchfield eq "holdingbranch" ) {
+            push @limits, sprintf "(%s)", join " or ", map { 'holdingbranch: ' . $_ } @branchcodes;
+        }
+        else {
+            push @limits, sprintf "(%s or %s)",
+              join( " or ", map { 'homebranch: ' . $_ } @branchcodes ),
+              join( " or ", map { 'holdingbranch: ' . $_ } @branchcodes );
+        }
+    }
+}
+
+for ( my $i=0; $i<@limits; $i++ ) {
+    if ( $limits[$i] =~ /^branch:/ ) {
+        my $branchfield  = C4::Context->preference('SearchLimitLibrary');
+        if ( $branchfield eq "homebranch" ) {
+            $limits[$i] =~ s/branch/homebranch/;
+        }
+        elsif ( $branchfield eq "holdingbranch" ) {
+            $limits[$i] =~ s/branch/holdingbranch/;
+        }
+        else {
+            my $homebranchlimit = $limits[$i];
+            my $holdingbranchlimit = $limits[$i];
+            $homebranchlimit =~ s/branch/homebranch/;
+            $holdingbranchlimit =~ s/branch/holdingbranch/;
+            $limits[$i] = "($homebranchlimit or $holdingbranchlimit)";
+        }
+    }
 }
 
 my $available;
@@ -610,7 +632,6 @@ if ($tag) {
     my $taglist = get_tags({term=>$tag, approved=>1});
     $results_hashref->{biblioserver}->{hits} = scalar (@$taglist);
     my @marclist = map { C4::Biblio::GetXmlBiblio( $_->{biblionumber} ) } @$taglist;
-    $DEBUG and printf STDERR "taglist (%s biblionumber)\nmarclist (%s records)\n", scalar(@$taglist), scalar(@marclist);
     $results_hashref->{biblioserver}->{RECORDS} = \@marclist;
     # FIXME: tag search and standard search should work together, not exclusively
     # FIXME: Because search and standard search don't work together OpacHiddenItems
@@ -811,8 +832,7 @@ for (my $i=0;$i<@servers;$i++) {
                 $template->param(searchdesc => 1);
             }
             $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 $hide = ($hidingrules) ? 1 : 0;
             my $branch = '';
             if (C4::Context->userenv){
                 $branch = C4::Context->userenv->{branch};
@@ -881,7 +901,7 @@ for (my $i=0;$i<@servers;$i++) {
             if ($nohits and $nohits=~/{QUERY_KW}/){
                 # extracting keywords in case of relaunching search
                 (my $query_kw=$query_desc)=~s/ and|or / /g;
-                my @query_kw=($query_kw=~ /([-\w]+\b)(?:[^,:]|$)/g);
+                my @query_kw=($query_kw=~ /([-\w]+\b)(?:[^:]|$)/g);
                 $query_kw=join('+',@query_kw);
                 $nohits=~s/{QUERY_KW}/$query_kw/g;
                 $template->param('OPACNoResultsFound' =>$nohits);