[Koha-patches] [PATCH] Bug 5984 : Allowing the librarians to hide items in the Opac using a system preference

Chris Cormack chrisc at catalyst.net.nz
Tue Mar 29 04:48:00 CEST 2011


Squashed commit of the following:

commit 72b578928b287ba3b5fa8965e42ff1ccbdf9013a
Author: Matthias Meusburger <matthias.meusburger at biblibre.com>
Date:   Wed Oct 20 11:26:46 2010 +0200

    Bug 5984 : MT4587, Follow-up: Hiding rules are now in a syspref

commit d95329955f976900afdafa82fe0a1699e8e892dc
Author: Matthias Meusburger <matthias.meusburger at biblibre.com>
Date:   Tue Oct 19 15:19:16 2010 +0200

    Bug 5984 : MT4587, Follow-up: Adds yaml config file for custom opac items hiding

commit 6777c1a97700b77095e4e499ca73040bf94271e2
Author: Matthias Meusburger <matthias.meusburger at biblibre.com>
Date:   Mon Oct 18 11:14:03 2010 +0200

    Bug 5984 : MT4587 : Adds yaml config file for custom opac items hiding
---
 C4/Items.pm                                        |   53 ++++++++++++++++++++
 C4/Search.pm                                       |   25 ++++++---
 docs/opac/OpacHiddenItems.txt                      |   12 +++++
 installer/data/mysql/updatedatabase.pl             |    9 +++
 .../opac-tmpl/prog/en/modules/opac-results.tmpl    |    3 +-
 opac/opac-detail.pl                                |   22 +++++++--
 6 files changed, 111 insertions(+), 13 deletions(-)
 create mode 100644 docs/opac/OpacHiddenItems.txt

diff --git a/C4/Items.pm b/C4/Items.pm
index d293608..b9cb3f1 100644
--- a/C4/Items.pm
+++ b/C4/Items.pm
@@ -33,6 +33,7 @@ use C4::Branch;
 require C4::Reserves;
 use C4::Charset;
 use C4::Acquisition;
+use List::MoreUtils qw/any/;
 
 use vars qw($VERSION @ISA @EXPORT);
 
@@ -68,6 +69,7 @@ BEGIN {
         get_itemnumbers_of
         GetItemnumberFromBarcode
         GetBarcodeFromItemnumber
+      GetHiddenItemnumbers
 
 		DelItemCheck
 		MoveItemFromBiblio 
@@ -1467,6 +1469,57 @@ sub GetBarcodeFromItemnumber {
     return ($result);
 }
 
+=head2 GetHiddenItemnumbers
+
+=over 4
+
+$result = GetHiddenItemnumbers(@items);
+
+=back
+
+=cut
+
+sub GetHiddenItemnumbers {
+    my (@items) = @_;
+    my @resultitems;
+
+    my $yaml = C4::Context->preference('OpacHiddenItems');
+    my $hidingrules;
+    eval {
+    	$hidingrules = YAML::Load($yaml);
+    };
+    if ($@) {
+    	warn "Unable to parse OpacHiddenItems syspref : $@";
+    	return ();
+    } else {
+    my $dbh = C4::Context->dbh;
+
+	# For each item
+	foreach my $item (@items) {
+
+	    # We check each rule
+	    foreach my $field (keys %$hidingrules) {
+		my $query = "SELECT $field from items where itemnumber = ?";
+		my $sth = $dbh->prepare($query);	
+		$sth->execute($item->{'itemnumber'});
+		my ($result) = $sth->fetchrow;
+
+		# If the results matches the values in the yaml file
+		if (any { $result eq $_ } @{$hidingrules->{$field}}) {
+
+		    # We add the itemnumber to the list
+		    push @resultitems, $item->{'itemnumber'};	    
+
+		    # If at least one rule matched for an item, no need to test the others
+		    last;
+		}
+	    }
+	}
+	return @resultitems;
+    }
+
+ }
+
 =head3 get_item_authorised_values
 
 find the types and values for all authorised values assigned to this item.
diff --git a/C4/Search.pm b/C4/Search.pm
index b698a93..f05d29a 100644
--- a/C4/Search.pm
+++ b/C4/Search.pm
@@ -29,6 +29,8 @@ use C4::XSLT;
 use C4::Branch;
 use C4::Reserves;    # CheckReserves
 use C4::Debug;
+use C4::Items;
+use YAML;
 use URI::Escape;
 
 use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS $DEBUG);
@@ -1581,8 +1583,14 @@ sub searchResults {
                 $item->{$code} = $field->subfield( $subfieldstosearch{$code} );
             }
 
-			my $hbranch     = C4::Context->preference('HomeOrHoldingBranch') eq 'homebranch' ? 'homebranch'    : 'holdingbranch';
-			my $otherbranch = C4::Context->preference('HomeOrHoldingBranch') eq 'homebranch' ? 'holdingbranch' : 'homebranch';
+	        # Hidden items
+	        my @items = ($item);
+	        my (@hiddenitems) = GetHiddenItemnumbers(@items);
+    	    $item->{'hideatopac'} = 1 if (@hiddenitems); 
+
+            my $hbranch     = C4::Context->preference('HomeOrHoldingBranch') eq 'homebranch' ? 'homebranch'    : 'holdingbranch';
+            my $otherbranch = C4::Context->preference('HomeOrHoldingBranch') eq 'homebranch' ? 'holdingbranch' : 'homebranch';
+
             # set item's branch name, use HomeOrHoldingBranch syspref first, fall back to the other one
             if ($item->{$hbranch}) {
                 $item->{'branchname'} = $branches{$item->{$hbranch}};
@@ -1654,6 +1662,7 @@ sub searchResults {
                     || $item->{itemlost}
                     || $item->{damaged}
                     || $item->{notforloan} > 0
+                    || $item->{hideatopac}
 		    || $reservestatus eq 'Waiting'
                     || ($transfertwhen ne ''))
                 {
@@ -1665,11 +1674,11 @@ sub searchResults {
                     $item->{status} = $item->{wthdrawn} . "-" . $item->{itemlost} . "-" . $item->{damaged} . "-" . $item->{notforloan};
                     $other_count++;
 
-					my $key = $prefix . $item->{status};
-					foreach (qw(wthdrawn itemlost damaged branchname itemcallnumber)) {
-                    	$other_items->{$key}->{$_} = $item->{$_};
-					}
-                    $other_items->{$key}->{intransit} = ($transfertwhen ne '') ? 1 : 0;
+                    my $key = $prefix . $item->{status};
+                    foreach (qw(wthdrawn itemlost damaged branchname itemcallnumber hideatopac)) {
+                        $other_items->{$key}->{$_} = $item->{$_};
+                    }
+                    $other_items->{$key}->{intransit} = ( $transfertwhen ne '' ) ? 1 : 0;
                     $other_items->{$key}->{onhold} = ($reservestatus) ? 1 : 0;
 					$other_items->{$key}->{notforloan} = GetAuthorisedValueDesc('','',$item->{notforloan},'','',$notforloan_authorised_value) if $notforloan_authorised_value;
 					$other_items->{$key}->{count}++ if $item->{$hbranch};
@@ -1681,7 +1690,7 @@ sub searchResults {
                     $can_place_holds = 1;
                     $available_count++;
 					$available_items->{$prefix}->{count}++ if $item->{$hbranch};
-					foreach (qw(branchname itemcallnumber)) {
+					foreach (qw(branchname itemcallnumber hideatopac)) {
                     	$available_items->{$prefix}->{$_} = $item->{$_};
 					}
 					$available_items->{$prefix}->{location} = $shelflocations->{ $item->{location} };
diff --git a/docs/opac/OpacHiddenItems.txt b/docs/opac/OpacHiddenItems.txt
new file mode 100644
index 0000000..625d465
--- /dev/null
+++ b/docs/opac/OpacHiddenItems.txt
@@ -0,0 +1,12 @@
+The OpacHiddenItems syspref allow the user to define custom rules
+for hiding specific items at opac.
+
+YAML syntax is used for defining such rules.
+
+Items can be hidden according to values from the items table:
+
+field: [value1, value2, ...]
+
+Example :
+wthdrawn: [0, 1]
+homebranch: [homebranch1, homebranch2]
diff --git a/installer/data/mysql/updatedatabase.pl b/installer/data/mysql/updatedatabase.pl
index 23b5d67..f584c03 100755
--- a/installer/data/mysql/updatedatabase.pl
+++ b/installer/data/mysql/updatedatabase.pl
@@ -4134,6 +4134,15 @@ if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
     SetVersion ($DBversion);
 }
 
+$DBversion = "3.03.00.XXX";
+if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
+    $dbh->do("
+	INSERT IGNORE INTO `systempreferences` (variable,value,explanation,options,type) VALUES('OpacHiddenItems','','This syspref allows to define custom rules for hiding specific items at opac. See docs/opac/OpacHiddenItems.txt for more informations.','','Textarea');
+	");
+    print "Upgrade to $DBversion done (Adding OpacHiddenItems syspref)\n";
+    SetVersion($DBversion);
+}
+
 =head1 FUNCTIONS
 
 =head2 DropAllForeignKeys($table)
diff --git a/koha-tmpl/opac-tmpl/prog/en/modules/opac-results.tmpl b/koha-tmpl/opac-tmpl/prog/en/modules/opac-results.tmpl
index d7aff2e..83641fc 100644
--- a/koha-tmpl/opac-tmpl/prog/en/modules/opac-results.tmpl
+++ b/koha-tmpl/opac-tmpl/prog/en/modules/opac-results.tmpl
@@ -431,7 +431,7 @@ $(document).ready(function(){
                     <!-- TMPL_IF NAME="available_items_loop" -->
                     <span class="available"><strong>Copies available:</strong>
                     <!-- TMPL_LOOP NAME="available_items_loop" -->
-
+                    <!-- TMPL_UNLESS NAME="hideatopac" -->
                     <!-- TMPL_IF NAME="singleBranchMode" -->
                         <!-- TMPL_VAR NAME="location" -->
                     <!-- TMPL_ELSE -->
@@ -443,6 +443,7 @@ $(document).ready(function(){
                         <!-- TMPL_IF NAME="itemcallnumber" -->[<a href="/cgi-bin/koha/opac-search.pl?q=callnum:<!-- TMPL_VAR NAME="itemcallnumber" ESCAPE="URL" -->"><!-- TMPL_VAR NAME="itemcallnumber" --></a>]<!-- /TMPL_IF -->
                     <!-- /TMPL_IF -->
                     (<!-- TMPL_VAR NAME="count" -->),
+                    <!-- /TMPL_UNLESS -->
                     <!-- /TMPL_LOOP -->
                     </span>
                     <!-- TMPL_ELSE -->
diff --git a/opac/opac-detail.pl b/opac/opac-detail.pl
index 1015e54..d54543f 100755
--- a/opac/opac-detail.pl
+++ b/opac/opac-detail.pl
@@ -41,6 +41,7 @@ use C4::Members;
 use C4::VirtualShelves;
 use C4::XSLT;
 use C4::ShelfBrowser;
+use List::MoreUtils qw/any none/;
 
 BEGIN {
 	if (C4::Context->preference('BakerTaylorEnabled')) {
@@ -80,14 +81,27 @@ $template->param('OPACShowCheckoutName' => C4::Context->preference("OPACShowChec
 # change back when ive fixed request.pl
 my @all_items = &GetItemsInfo( $biblionumber, 'opac' );
 my @items;
- at items = @all_items unless C4::Context->preference('hidelostitems');
 
-if (C4::Context->preference('hidelostitems')) {
-    # Hide host items
+# Getting items to be hidden
+my @hiddenitems = GetHiddenItemnumbers(@all_items);
+
+# Are there items to hide?
+my $hideitems = 1 if C4::Context->preference('hidelostitems') or scalar(@hiddenitems) > 0;
+
+# Hide items
+if ($hideitems) {
     for my $itm (@all_items) {
-        push @items, $itm unless $itm->{itemlost};
+	if  ( C4::Context->preference('hidelostitems') ) {
+	    push @items, $itm unless $itm->{itemlost} or any { $itm->{'itemnumber'} eq $_ } @hiddenitems;
+	} else {
+	    push @items, $itm unless any { $itm->{'itemnumber'} eq $_ } @hiddenitems;
     }
 }
+} else {
+    # Or not
+    @items = @all_items;
+}
+
 my $dat = &GetBiblioData($biblionumber);
 
 my $itemtypes = GetItemTypes();
-- 
1.7.1



More information about the Koha-patches mailing list