From d5741785a9f3b1282bf1a733c059974b8c29e678 Mon Sep 17 00:00:00 2001 From: Nick Clemens Date: Thu, 19 Dec 2019 05:29:47 +0000 Subject: [PATCH] Bug 3426: Allow for multiple fields in itemcallnumber syspref Note that we change both cataloguing/additem.pl and C4/Items->PrepareItemrecordfordisplay I can find no code that uses callnumber from the C4/Items sub, except for the itemrecorddisplay script which is not called with an itemnumber from Koha and should be deprecated for REST or ILSDI or OAI (imho) To test: 1 - Define itemcallnumber syspref as "082ab,092ab,9520,245a" 2 - Find a record with no items 3 - Ensure it has no 082 field, but an 092 field 4 - Go to add an item - itemcallnumber is empty 5 - Apply patch 6 - Go to add item, itemcallnumber should be the 092ab fields 7 - Delete the 092 field 8 - Go to add item, itemcallnumber should be the 245a 9 - Edit the callnumber to be "testing" and save item 10 - For should now show itemcallnumber="testing" as default 11 - Browse to http://localhost:8081/cgi-bin/koha/services/itemrecorddisplay.pl?itemnumber=## subbing the correct itemnumber 12 - Ensure the callnumber is defaulting to testing 13 - delete the item you created 14 - browse to URL above - callnumber should now be 245 again 15 - Add an 092 field to record and ensure it is now default callnumber 16 - Add an 082 field, it should now be default --- C4/Items.pm | 12 +++++++----- cataloguing/additem.pl | 17 ++++++++--------- .../prog/en/modules/admin/preferences/cataloguing.pref | 4 ++-- 3 files changed, 17 insertions(+), 16 deletions(-) diff --git a/C4/Items.pm b/C4/Items.pm index 4f6a587db2..9071c71bd1 100644 --- a/C4/Items.pm +++ b/C4/Items.pm @@ -2401,11 +2401,13 @@ sub PrepareItemrecordDisplay { # search for itemcallnumber if applicable if ( $tagslib->{$tag}->{$subfield}->{kohafield} eq 'items.itemcallnumber' - && C4::Context->preference('itemcallnumber') ) { - my $CNtag = substr( C4::Context->preference('itemcallnumber'), 0, 3 ); - my $CNsubfield = substr( C4::Context->preference('itemcallnumber'), 3, 1 ); - if ( $itemrecord and my $field = $itemrecord->field($CNtag) ) { - $defaultvalue = $field->subfield($CNsubfield); + && C4::Context->preference('itemcallnumber') && $itemrecord) { + foreach my $itemcn_pref (split(/,/,C4::Context->preference('itemcallnumber'))){ + my $CNtag = substr( $itemcn_pref, 0, 3 ); + next unless my $field = $itemrecord->field($CNtag); + my $CNsubfields = substr( $itemcn_pref, 3 ); + $defaultvalue = $field->as_string( $CNsubfields, ' '); + last if $defaultvalue; } } if ( $tagslib->{$tag}->{$subfield}->{kohafield} eq 'items.itemcallnumber' diff --git a/cataloguing/additem.pl b/cataloguing/additem.pl index 38fb34bc3c..aedca6f82a 100755 --- a/cataloguing/additem.pl +++ b/cataloguing/additem.pl @@ -154,20 +154,21 @@ sub generate_subfield_form { my $pref_itemcallnumber = C4::Context->preference('itemcallnumber'); if (!$value && $subfieldlib->{kohafield} eq 'items.itemcallnumber' && $pref_itemcallnumber) { - my $CNtag = substr( $pref_itemcallnumber, 0, 3 ); # 3-digit tag number - my $CNsubfields = substr( $pref_itemcallnumber, 3 ); # Any and all subfields - my @subfields = ( $CNsubfields =~ m/./g ); # Split into single-character elements - my $temp2 = $temp->field($CNtag); + foreach my $pref_itemcallnumber_part (split(/,/, $pref_itemcallnumber)){ + my $CNtag = substr( $pref_itemcallnumber, 0, 3 ); # 3-digit tag number + my $CNsubfields = substr( $pref_itemcallnumber, 3 ); # Any and all subfields + my @subfields = ( $CNsubfields =~ m/./g ); # Split into single-character elements + my $temp2 = $temp->field($CNtag); - if ($temp2) { + next unless $temp2; my @selectedsubfields; foreach my $subfieldcode( @subfields ){ push @selectedsubfields, $temp2->subfield( $subfieldcode ); } $value = join( ' ', @selectedsubfields ); - - #remove any trailing space incase one subfield is used $value =~ s/^\s+|\s+$//g; + #remove any trailing space incase one subfield is used + last if $value; } } @@ -889,8 +890,6 @@ foreach my $subfield_code (sort keys(%witness)) { my @loop_data =(); my $i=0; -my $pref_itemcallnumber = C4::Context->preference('itemcallnumber'); - my $branch = $input->param('branch') || C4::Context->userenv->{branch}; my $libraries = Koha::Libraries->search({}, { order_by => ['branchname'] })->unblessed;# build once ahead of time, instead of multiple times later. for my $library ( @$libraries ) { diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/cataloguing.pref b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/cataloguing.pref index dbfd788c66..61bf51dd44 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/cataloguing.pref +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/cataloguing.pref @@ -72,9 +72,9 @@ Cataloging: no: bibliographic record - as the authoritative item type (for determining circulation and fines rules, for displaying an item type icon on either opac detail or results page, etc). - - - Map the MARC subfield + - Map the MARC subfields - pref: itemcallnumber - - "to an item's callnumber. (This can contain multiple subfields to look in; for instance 082ab would look in 082 subfields a and b.)
Examples (for MARC21 records): Dewey: 082ab or 092ab; LOC: 050ab or 090ab; from the item record: 852hi" + - "to an item's callnumber. List multiple comma-separated fields to check them sequentially. Each field can include multiple subfields. For example: '082ab,092ab' will look in the 082$a and 082$b, then the 092$a and 092$b. Examples (for MARC21 records): Dewey: 082ab,092ab; LOC: 050ab,090ab; from the item record: 952hi" - - Display MARC subfield - pref: AlternateHoldingsField -- 2.11.0