Bug 26314: Only display volumes link when required

This patch makes C4::XSLT query for volumes the same way it would do
with the generated link (i.e. based on UseControlNumber) and passes
a flag to the XSLT so it displays (or not) the 'Show volumes' link.

To test:
1. Apply the first patch
2. Have a known record without volumes
3. Open the record in the OPAC
=> FAIL: It shows the 'Show volumes' link
4. Have a record known to have volumes
5. Open the record in the OPAC
=> SUCCESS: It shows the 'Show volumes' link
6. Apply this patch and restart_all
7. Reload the above records
=> SUCCESS: It shows the link where it has to, and hides it where it
   shouldn't be displayed.
8. Repeat for Intranet
9. Sign off :-D

Signed-off-by: Michaela Sieber <michaela.sieber@kit.edu>
Signed-off-by: Katrin Fischer <katrin.fischer@bsz-bw.de>
Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io>
This commit is contained in:
Martin Renvoize 2021-08-09 11:39:56 +01:00 committed by Tomas Cohen Arazi
parent f27ed123be
commit cd0a374b93
Signed by: tomascohen
GPG key ID: 0A272EA1B2F3C15F
5 changed files with 116 additions and 3 deletions

View file

@ -224,6 +224,14 @@ sub XSLTParse4Display {
}
}
# possibly show volumes link in Detail views
if ($xslsyspref =~ m/Details/) {
$biblio //= Koha::Biblios->find( $biblionumber );
my $volumes = $biblio->get_marc_volumes();
$variables->{show_volumes_link} = ( scalar @{$volumes} == 0 ) ? 0 : 1;
}
# embed variables
my $varxml = "<variables>\n";
while (my ($key, $value) = each %$variables) {
$value //= q{};

View file

@ -1658,6 +1658,76 @@ sub opac_summary_html {
return $summary_html;
}
=head3 get_marc_volumes
my $volumes = $self->get_marc_volumes();
Returns an array of MARCXML data, which are volumes parts of
this object (MARC21 773$w points to this)
=cut
sub get_marc_volumes {
my ($self, $max_results) = @_;
return [] if (C4::Context->preference('marcflavour') ne 'MARC21');
my $searchstr = $self->get_volumes_query;
if (defined($searchstr)) {
my $searcher = Koha::SearchEngine::Search->new({index => $Koha::SearchEngine::BIBLIOS_INDEX});
my ( $errors, $results, $total_hits ) = $searcher->simple_search_compat( $searchstr, 0, $max_results );
$self->{_volumes} = $results if ( defined($results) && scalar(@$results) );
}
return $self->{_volumes} || [];
}
=head2 get_volumes_query
Returns a query which can be used to search for all component parts of MARC21 biblios
=cut
sub get_volumes_query {
my ($self) = @_;
my $marc = $self->metadata->record;
my $searchstr;
if ( C4::Context->preference('UseControlNumber') ) {
my $pf001 = $marc->field('001') || undef;
if ( defined($pf001) ) {
$searchstr = "(";
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 .= ")";
}
# exclude monograph and serial component part records
$searchstr .= " NOT (bib-level:a OR bib-level:b)";
$searchstr .= ")";
}
}
else {
my $cleaned_title = $marc->title;
$cleaned_title =~ tr|/||;
$searchstr = "ti,phr:($cleaned_title)";
}
return $searchstr;
}
=head2 Internal methods
=head3 type

View file

@ -231,7 +231,8 @@
</xsl:if>
<!-- Volumes of sets and traced series -->
<xsl:if test="$materialTypeCode='ST' or substring($controlField008,22,1)='m'">
<xsl:variable name="show_volumes_link" select="marc:variables/marc:variable[@name='show_volumes_link']" />
<xsl:if test="$show_volumes_link='1' and ($materialTypeCode='ST' or substring($controlField008,22,1)='m')">
<span class="results_summary volumes"><span class="label">Volumes: </span>
<a>
<xsl:choose>

View file

@ -273,7 +273,8 @@
</xsl:if>
<!-- Volumes of sets and traced series -->
<xsl:if test="$materialTypeCode='ST' or substring($controlField008,22,1)='m'">
<xsl:variable name="show_volumes_link" select="marc:variables/marc:variable[@name='show_volumes_link']" />
<xsl:if test="$show_volumes_link='1' and ($materialTypeCode='ST' or substring($controlField008,22,1)='m')">
<span class="results_summary volumes"><span class="label">Volumes: </span>
<a>
<xsl:choose>

View file

@ -17,7 +17,7 @@
use Modern::Perl;
use Test::More tests => 29;
use Test::More tests => 30;
use Test::Exception;
use Test::Warn;
@ -615,6 +615,39 @@ subtest 'get_components_query' => sub {
}
};
subtest 'get_volumes_query' => sub {
plan tests => 3;
my $biblio = $builder->build_sample_biblio();
my $biblionumber = $biblio->biblionumber;
my $record = $biblio->metadata->record;
t::lib::Mocks::mock_preference( 'UseControlNumber', '0' );
is( $biblio->get_volumes_query, "ti,phr:(Some boring read)", "UseControlNumber disabled" );
t::lib::Mocks::mock_preference( 'UseControlNumber', '1' );
my $marc_001_field = MARC::Field->new( '001', $biblionumber );
$record->append_fields($marc_001_field);
C4::Biblio::ModBiblio( $record, $biblio->biblionumber );
$biblio = Koha::Biblios->find( $biblio->biblionumber );
is(
$biblio->get_volumes_query, "rcn:$biblionumber NOT (bib-level:a OR bib-level:b)",
"UseControlNumber enabled without MarcOrgCode"
);
my $marc_003_field = MARC::Field->new( '003', 'OSt' );
$record->append_fields($marc_003_field);
C4::Biblio::ModBiblio( $record, $biblio->biblionumber );
$biblio = Koha::Biblios->find( $biblio->biblionumber );
is(
$biblio->get_volumes_query,
"((rcn:$biblionumber AND cni:OSt) OR rcn:OSt $biblionumber) NOT (bib-level:a OR bib-level:b)",
"UseControlNumber enabled with MarcOrgCode"
);
};
subtest 'orders() and active_orders() tests' => sub {
plan tests => 5;