From 972d04a4579d3a03c29a40f17a41b00aa2edeb90 Mon Sep 17 00:00:00 2001 From: Martin Renvoize Date: Tue, 3 Aug 2021 14:29:27 +0100 Subject: [PATCH] Bug 11175: (QA follow-up) Take account of bug 15851 We can simplify the code introduced by bug 15851 by moving the 'show_analytics_link' variable assignment into C4::XSLT and thus making the code more DRY. Taking the code in bug 15851 as inspiration this patch also adds proper handling for UseControlNumber vs EasyAnalytics style 773 linking and ensures we only return analytic component parts and no other records containing 773's. Signed-off-by: Martin Renvoize --- C4/XSLT.pm | 44 +++++++++++++++++++++++--------------------- Koha/Util/Search.pm | 42 ++++++++++++++++++++++++++++-------------- catalogue/detail.pl | 19 ------------------- opac/opac-detail.pl | 15 --------------- 4 files changed, 51 insertions(+), 69 deletions(-) diff --git a/C4/XSLT.pm b/C4/XSLT.pm index 8232aa07f9..a9425e3b18 100644 --- a/C4/XSLT.pm +++ b/C4/XSLT.pm @@ -269,31 +269,33 @@ sub XSLTParse4Display { my $partsxml = ''; # possibly insert component records into Detail views if ($xslsyspref =~ m/Details/) { + my $biblio = Koha::Biblios->find( $biblionumber ); + my $components = $biblio->get_marc_components(300); + $variables->{show_analytics_link} = ( scalar @{$components} == 0 ) ? 0 : 1; + my $showcomp = C4::Context->preference('ShowComponentRecords'); if ( $showcomp eq 'both' || ($showcomp eq 'staff' && $xslsyspref !~ m/OPAC/ ) || ($showcomp eq 'opac' && $xslsyspref =~ m/OPAC/ ) ) { - my $biblio = Koha::Biblios->find( $biblionumber ); - my $max_results = 300; - - if ( $biblio->get_marc_components($max_results) ) { - my $search_query = Koha::Util::Search::get_component_part_query($biblionumber); - $variables->{ComponentPartQuery} = $search_query; - - my @componentPartRecordXML = (''); - for my $cb ( @{ $biblio->get_marc_components($max_results) } ) { - if( ref $cb eq 'MARC::Record'){ - $cb = $cb->as_xml_record(); - } else { - $cb = decode('utf8', $cb); - } - # Remove the xml header - $cb =~ s/^<\?xml.*?\?>//; - push @componentPartRecordXML,$cb; - } - push @componentPartRecordXML, ''; - $partsxml = join "\n", @componentPartRecordXML; - } + + $variables->{show_analytics_link} = 0; + + my $search_query = Koha::Util::Search::get_component_part_query($biblionumber); + $variables->{ComponentPartQuery} = $search_query; + + my @componentPartRecordXML = (''); + for my $cb ( @{ $biblio->get_marc_components($max_results) } ) { + if( ref $cb eq 'MARC::Record'){ + $cb = $cb->as_xml_record(); + } else { + $cb = decode('utf8', $cb); + } + # Remove the xml header + $cb =~ s/^<\?xml.*?\?>//; + push @componentPartRecordXML,$cb; + } + push @componentPartRecordXML, ''; + $partsxml = join "\n", @componentPartRecordXML; } } diff --git a/Koha/Util/Search.pm b/Koha/Util/Search.pm index 0228183e35..e55200eb37 100644 --- a/Koha/Util/Search.pm +++ b/Koha/Util/Search.pm @@ -36,22 +36,36 @@ Returns a query which can be used to search for all component parts of MARC21 bi sub get_component_part_query { my ($biblionumber) = @_; - my $marc = C4::Biblio::GetMarcBiblio({ biblionumber => $biblionumber }); - my $pf001 = $marc->field('001') || undef; - - if (defined($pf001)) { - my $pf003 = $marc->field('003') || undef; - my $searchstr; - - if (!defined($pf003)) { - # search for 773$w='Host001' - $searchstr = "rcn=\"".$pf001->data()."\""; - } else { - # search for (773$w='Host001' and 003='Host003') or 773$w='Host003 Host001') - $searchstr = "(rcn=\"".$pf001->data()."\" AND cni=\"".$pf003->data()."\")"; - $searchstr .= " OR rcn=\"".$pf003->data()." ".$pf001->data()."\""; + my $marc = C4::Biblio::GetMarcBiblio( { biblionumber => $biblionumber } ); + + my $searchstr; + if ( C4::Context->preference('UseControlNumber') ) { + my $pf001 = $marc->field('001') || undef; + + if ( defined($pf001) ) { + my $pf003 = $marc->field('003') || undef; + + if ( !defined($pf003) ) { + # search for 773$w='Host001' + $searchstr = "rcn=\"" . $pf001->data() . "\""; + } + else { + $searchstr = "("; + # search for (773$w='Host001' and 003='Host003') or 773$w='Host003 Host001') + $searchstr .= "(rcn=\"" . $pf001->data() . "\" AND cni=\"" . $pf003->data() . "\")"; + $searchstr .= " OR rcn=\"" . $pf003->data() . " " . $pf001->data() . "\""; + $searchstr .= ")"; + } + + # limit to monograph and serial component part records + $serachstr .= " AND (bib-level:a OR bib-level:b)"; } } + else { + my $cleaned_title = $marc->title; + $cleaned_title =~ tr|/||; + $searchstr = "Host-item:($cleaned_title)"; + } } 1; diff --git a/catalogue/detail.pl b/catalogue/detail.pl index b06c90a866..8017b0c6ac 100755 --- a/catalogue/detail.pl +++ b/catalogue/detail.pl @@ -129,30 +129,11 @@ my $sysxml = $xslfile ? C4::XSLT::get_xslt_sysprefs() : undef; if ( $xslfile ) { - my $searcher = Koha::SearchEngine::Search->new( - { index => $Koha::SearchEngine::BIBLIOS_INDEX } - ); - my $cleaned_title = $biblio->title; - $cleaned_title =~ tr|/||; - my $query = - ( C4::Context->preference('UseControlNumber') and $record->field('001') ) - ? 'rcn:'. $record->field('001')->data . ' AND (bib-level:a OR bib-level:b)' - : "Host-item:($cleaned_title)"; - my ( $err, $result, $count ) = $searcher->simple_search_compat( $query, 0, 0 ); - - warn "Warning from simple_search_compat: $err" - if $err; - - my $variables = { - show_analytics_link => $count > 0 ? 1 : 0 - }; - $template->param( XSLTDetailsDisplay => '1', XSLTBloc => XSLTParse4Display( $biblionumber, $record, "XSLTDetailsDisplay", 1, undef, $sysxml, $xslfile, $lang, - $variables ) ); } diff --git a/opac/opac-detail.pl b/opac/opac-detail.pl index cbb216e291..da5f19f2ab 100755 --- a/opac/opac-detail.pl +++ b/opac/opac-detail.pl @@ -200,23 +200,8 @@ my $sysxml = $xslfile ? C4::XSLT::get_xslt_sysprefs() : undef; if ( $xslfile ) { - my $searcher = Koha::SearchEngine::Search->new( - { index => $Koha::SearchEngine::BIBLIOS_INDEX } - ); - my $cleaned_title = $biblio->title; - $cleaned_title =~ tr|/||; - my $query = - ( C4::Context->preference('UseControlNumber') and $record->field('001') ) - ? 'rcn:'. $record->field('001')->data . ' AND (bib-level:a OR bib-level:b)' - : "Host-item:($cleaned_title)"; - my ( $err, $result, $count ) = $searcher->simple_search_compat( $query, 0, 0 ); - - warn "Warning from simple_search_compat: $err" - if $err; - my $variables = { anonymous_session => ($borrowernumber) ? 0 : 1, - show_analytics_link => $count > 0 ? 1 : 0 }; my @plugin_responses = Koha::Plugins->call( -- 2.20.1