From 1afce57843a87e06b1374b0a90448265665d49b1 Mon Sep 17 00:00:00 2001 From: Julian Maurice Date: Tue, 30 Nov 2021 14:04:21 +0100 Subject: [PATCH] Bug 29606: Include items from host record in XML for XSLT processing If EasyAnalyticalRecords is enabled, items from host records should be included in the XML. Otherwise, OPAC search results show no items. Test plan: 0. Do not apply the patch yet 1. Enable syspref EasyAnalyticalRecords and set OPACXSLTResultsDisplay to 'default' 2. Create a biblio record with title "parent" and create an item with a barcode for this biblio 3. Create a biblio record with title "child" with no items. On the biblio detail page, in the toolbar, click "Edit -> Link to host record" and enter the barcode for the item you created at step 2 4. Duplicate this biblio record, to be sure you will have at least two results with the search "child" (and not be redirected to the detail page) 5. Make sure your search index (zebra or elasticsearch) is up to date 6. Go to OPAC and search "child". You should see two results, no items. Click on one of them. On the detail page you should see one item (the one from the host record) 7. Apply the patch 8. Go to OPAC and search "child". You should now see one item (the same item) for each result. --- C4/XSLT.pm | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/C4/XSLT.pm b/C4/XSLT.pm index 125f887cb0..ad1db20e37 100644 --- a/C4/XSLT.pm +++ b/C4/XSLT.pm @@ -259,7 +259,7 @@ sub XSLTParse4Display { if ( $xslsyspref eq "OPACXSLTDetailsDisplay" || $xslsyspref eq "XSLTDetailsDisplay" || $xslsyspref eq "XSLTResultsDisplay" ) { $itemsxml = ""; #We don't use XSLT for items display on these pages } else { - $itemsxml = buildKohaItemsNamespace($biblionumber, $hidden_items, $items_rs); + $itemsxml = buildKohaItemsNamespace($biblionumber, $hidden_items, $items_rs, $record); } my $xmlrecord = $record->as_xml(C4::Context->preference('marcflavour')); @@ -319,20 +319,30 @@ Is only used in this module currently. =cut sub buildKohaItemsNamespace { - my ($biblionumber, $hidden_items, $items_rs) = @_; + my ($biblionumber, $hidden_items, $items_rs, $record) = @_; $hidden_items ||= []; - my $query = {}; - $query = { 'me.itemnumber' => { not_in => $hidden_items } } - if $hidden_items; - unless ( $items_rs && ref($items_rs) eq 'Koha::Items' ) { - $query->{'me.biblionumber'} = $biblionumber; - $items_rs = Koha::Items->new; + # adding linked items that belong to host records + my @linkeditemnumbers; + if ( C4::Context->preference('EasyAnalyticalRecords') ) { + my $analyticsfield = C4::Context->preference("marcflavour") eq 'UNIMARC' ? '461' : '773'; + @linkeditemnumbers = map { $_->subfield('9') } $record->field($analyticsfield); + } + + $items_rs = Koha::Items->search( + [ + 'me.biblionumber' => $biblionumber, + 'me.itemnumber' => { in => \@linkeditemnumbers }, + ] + ); } - my $items = $items_rs->search( $query, { prefetch => [ 'branchtransfers', 'reserves' ] } ); + my $items = $items_rs->search( + { 'me.itemnumber' => { not_in => $hidden_items } }, + { prefetch => [ 'branchtransfers', 'reserves' ] } + ); my $shelflocations = { map { $_->{authorised_value} => $_->{opac_description} } Koha::AuthorisedValues->get_descriptions_by_koha_field( { frameworkcode => "", kohafield => 'items.location' } ) }; -- 2.30.2