View | Details | Raw Unified | Return to bug 26314
Collapse All | Expand All

(-)a/C4/XSLT.pm (-1 / +11 lines)
Lines 267-275 sub XSLTParse4Display { Link Here
267
    my $xmlrecord = $record->as_xml(C4::Context->preference('marcflavour'));
267
    my $xmlrecord = $record->as_xml(C4::Context->preference('marcflavour'));
268
268
269
    $variables ||= {};
269
    $variables ||= {};
270
    my $biblio;
270
    if (C4::Context->preference('OPACShowOpenURL')) {
271
    if (C4::Context->preference('OPACShowOpenURL')) {
271
        my @biblio_itemtypes;
272
        my @biblio_itemtypes;
272
        my $biblio = Koha::Biblios->find($biblionumber);
273
        $biblio //= Koha::Biblios->find($biblionumber);
273
        if (C4::Context->preference('item-level_itypes')) {
274
        if (C4::Context->preference('item-level_itypes')) {
274
            @biblio_itemtypes = $biblio->items->get_column("itype");
275
            @biblio_itemtypes = $biblio->items->get_column("itype");
275
        } else {
276
        } else {
Lines 282-287 sub XSLTParse4Display { Link Here
282
            $variables->{OpenURLResolverURL} = $biblio->get_openurl;
283
            $variables->{OpenURLResolverURL} = $biblio->get_openurl;
283
        }
284
        }
284
    }
285
    }
286
287
    # possibly show volumes link in Detail views
288
    if ($xslsyspref =~ m/Details/) {
289
        $biblio //= Koha::Biblios->find( $biblionumber );
290
        my $components = $biblio->get_marc_volumes();
291
        $variables->{show_volumes_link} = ( scalar @{$components} == 0 ) ? 0 : 1;
292
    }
293
294
    # embed variables
285
    my $varxml = "<variables>\n";
295
    my $varxml = "<variables>\n";
286
    while (my ($key, $value) = each %$variables) {
296
    while (my ($key, $value) = each %$variables) {
287
        $varxml .= "<variable name=\"$key\">$value</variable>\n";
297
        $varxml .= "<variable name=\"$key\">$value</variable>\n";
(-)a/Koha/Biblio.pm (+70 lines)
Lines 952-957 sub get_marc_host { Link Here
952
    }
952
    }
953
}
953
}
954
954
955
=head3 get_marc_volumes
956
957
  my $volumes = $self->get_marc_volumes();
958
959
Returns an array of MARCXML data, which are volumes parts of
960
this object (MARC21 773$w points to this)
961
962
=cut
963
964
sub get_marc_volumes {
965
    my ($self, $max_results) = @_;
966
967
    return [] if (C4::Context->preference('marcflavour') ne 'MARC21');
968
969
    my $searchstr = $self->get_volumes_query;
970
971
    if (defined($searchstr)) {
972
        my $searcher = Koha::SearchEngine::Search->new({index => $Koha::SearchEngine::BIBLIOS_INDEX});
973
        my ( $errors, $results, $total_hits ) = $searcher->simple_search_compat( $searchstr, 0, $max_results );
974
        $self->{_volumes} = $results if ( defined($results) && scalar(@$results) );
975
    }
976
977
    return $self->{_volumes} || [];
978
}
979
980
=head2 get_volumes_query
981
982
Returns a query which can be used to search for all component parts of MARC21 biblios
983
984
=cut
985
986
sub get_volumes_query {
987
    my ($self) = @_;
988
989
    my $marc = $self->metadata->record;
990
991
    my $searchstr;
992
    if ( C4::Context->preference('UseControlNumber') ) {
993
        my $pf001 = $marc->field('001') || undef;
994
995
        if ( defined($pf001) ) {
996
            $searchstr = "(";
997
            my $pf003 = $marc->field('003') || undef;
998
999
            if ( !defined($pf003) ) {
1000
                # search for 773$w='Host001'
1001
                $searchstr .= "rcn:" . $pf001->data();
1002
            }
1003
            else {
1004
                $searchstr .= "(";
1005
                # search for (773$w='Host001' and 003='Host003') or 773$w='(Host003)Host001'
1006
                $searchstr .= "(rcn:" . $pf001->data() . " AND cni:" . $pf003->data() . ")";
1007
                $searchstr .= " OR rcn:\"" . $pf003->data() . " " . $pf001->data() . "\"";
1008
                $searchstr .= ")";
1009
            }
1010
1011
            # exclude monograph and serial component part records
1012
            $searchstr .= " NOT (bib-level:a OR bib-level:b)";
1013
            $searchstr .= ")";
1014
        }
1015
    }
1016
    else {
1017
        my $cleaned_title = $marc->title;
1018
        $cleaned_title =~ tr|/||;
1019
        $searchstr = "ti,phr:($cleaned_title)";
1020
    }
1021
1022
    return $searchstr;
1023
}
1024
955
=head2 Internal methods
1025
=head2 Internal methods
956
1026
957
=head3 type
1027
=head3 type
(-)a/koha-tmpl/intranet-tmpl/prog/en/xslt/MARC21slim2intranetDetail.xsl (-1 / +2 lines)
Lines 231-237 Link Here
231
        </xsl:if>
231
        </xsl:if>
232
232
233
        <!-- Volumes of sets and traced series -->
233
        <!-- Volumes of sets and traced series -->
234
        <xsl:if test="$materialTypeCode='ST' or substring($controlField008,22,1)='m'">
234
        <xsl:variable name="show_volumes_link" select="marc:variables/marc:variable[@name='show_volumes_link']" />
235
        <xsl:if test="$show_volumes_link='1' and ($materialTypeCode='ST' or substring($controlField008,22,1)='m')">
235
        <span class="results_summary volumes"><span class="label">Volumes: </span>
236
        <span class="results_summary volumes"><span class="label">Volumes: </span>
236
            <a>
237
            <a>
237
            <xsl:choose>
238
            <xsl:choose>
(-)a/koha-tmpl/opac-tmpl/bootstrap/en/xslt/MARC21slim2OPACDetail.xsl (-1 / +2 lines)
Lines 266-272 Link Here
266
        </xsl:if>
266
        </xsl:if>
267
267
268
        <!-- Volumes of sets and traced series -->
268
        <!-- Volumes of sets and traced series -->
269
        <xsl:if test="$materialTypeCode='ST' or substring($controlField008,22,1)='m'">
269
        <xsl:variable name="show_volumes_link" select="marc:variables/marc:variable[@name='show_volumes_link']" />
270
        <xsl:if test="$show_volumes_link='1' and ($materialTypeCode='ST' or substring($controlField008,22,1)='m')">
270
        <span class="results_summary volumes"><span class="label">Volumes: </span>
271
        <span class="results_summary volumes"><span class="label">Volumes: </span>
271
            <a>
272
            <a>
272
            <xsl:choose>
273
            <xsl:choose>
(-)a/t/db_dependent/Koha/Biblio.t (-2 / +27 lines)
Lines 17-23 Link Here
17
17
18
use Modern::Perl;
18
use Modern::Perl;
19
19
20
use Test::More tests => 14;
20
use Test::More tests => 15;
21
21
22
use C4::Biblio qw( AddBiblio ModBiblio );
22
use C4::Biblio qw( AddBiblio ModBiblio );
23
use Koha::Database;
23
use Koha::Database;
Lines 499-504 subtest 'suggestions() tests' => sub { Link Here
499
    $schema->storage->txn_rollback;
499
    $schema->storage->txn_rollback;
500
};
500
};
501
501
502
subtest 'get_volumes_query' => sub {
503
    plan tests => 3;
504
505
    my $biblio = $builder->build_sample_biblio();
506
    my $biblionumber = $biblio->biblionumber;
507
    my $record = $biblio->metadata->record;
508
509
    t::lib::Mocks::mock_preference( 'UseControlNumber', '0' );
510
    is($biblio->get_volumes_query, "ti,phr:(Some boring read)", "UseControlNumber disabled");
511
512
    t::lib::Mocks::mock_preference( 'UseControlNumber', '1' );
513
    my $marc_001_field = MARC::Field->new('001', $biblionumber);
514
    $record->append_fields($marc_001_field);
515
    C4::Biblio::ModBiblio( $record, $biblio->biblionumber );
516
    $biblio = Koha::Biblios->find( $biblio->biblionumber);
517
518
    is($biblio->get_volumes_query, "rcn:$biblionumber NOT (bib-level:a OR bib-level:b)", "UseControlNumber enabled without MarcOrgCode");
519
520
    my $marc_003_field = MARC::Field->new('003', 'OSt');
521
    $record->append_fields($marc_003_field);
522
    C4::Biblio::ModBiblio( $record, $biblio->biblionumber );
523
    $biblio = Koha::Biblios->find( $biblio->biblionumber);
524
525
    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");
526
};
527
502
subtest 'orders() and active_orders() tests' => sub {
528
subtest 'orders() and active_orders() tests' => sub {
503
529
504
    plan tests => 5;
530
    plan tests => 5;
505
- 

Return to bug 26314