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

(-)a/C4/XSLT.pm (-1 / +11 lines)
Lines 264-272 sub XSLTParse4Display { Link Here
264
    my $xmlrecord = $record->as_xml(C4::Context->preference('marcflavour'));
264
    my $xmlrecord = $record->as_xml(C4::Context->preference('marcflavour'));
265
265
266
    $variables ||= {};
266
    $variables ||= {};
267
    my $biblio;
267
    if (C4::Context->preference('OPACShowOpenURL')) {
268
    if (C4::Context->preference('OPACShowOpenURL')) {
268
        my @biblio_itemtypes;
269
        my @biblio_itemtypes;
269
        my $biblio = Koha::Biblios->find($biblionumber);
270
        $biblio //= Koha::Biblios->find($biblionumber);
270
        if (C4::Context->preference('item-level_itypes')) {
271
        if (C4::Context->preference('item-level_itypes')) {
271
            @biblio_itemtypes = $biblio->items->get_column("itype");
272
            @biblio_itemtypes = $biblio->items->get_column("itype");
272
        } else {
273
        } else {
Lines 279-284 sub XSLTParse4Display { Link Here
279
            $variables->{OpenURLResolverURL} = $biblio->get_openurl;
280
            $variables->{OpenURLResolverURL} = $biblio->get_openurl;
280
        }
281
        }
281
    }
282
    }
283
284
    # possibly show volumes link in Detail views
285
    if ($xslsyspref =~ m/Details/) {
286
        $biblio //= Koha::Biblios->find( $biblionumber );
287
        my $volumes = $biblio->get_marc_volumes();
288
        $variables->{show_volumes_link} = ( scalar @{$volumes} == 0 ) ? 0 : 1;
289
    }
290
291
    # embed variables
282
    my $varxml = "<variables>\n";
292
    my $varxml = "<variables>\n";
283
    while (my ($key, $value) = each %$variables) {
293
    while (my ($key, $value) = each %$variables) {
284
        $varxml .= "<variable name=\"$key\">$value</variable>\n";
294
        $varxml .= "<variable name=\"$key\">$value</variable>\n";
(-)a/Koha/Biblio.pm (+70 lines)
Lines 942-947 sub get_marc_host { Link Here
942
    }
942
    }
943
}
943
}
944
944
945
=head3 get_marc_volumes
946
947
  my $volumes = $self->get_marc_volumes();
948
949
Returns an array of MARCXML data, which are volumes parts of
950
this object (MARC21 773$w points to this)
951
952
=cut
953
954
sub get_marc_volumes {
955
    my ($self, $max_results) = @_;
956
957
    return [] if (C4::Context->preference('marcflavour') ne 'MARC21');
958
959
    my $searchstr = $self->get_volumes_query;
960
961
    if (defined($searchstr)) {
962
        my $searcher = Koha::SearchEngine::Search->new({index => $Koha::SearchEngine::BIBLIOS_INDEX});
963
        my ( $errors, $results, $total_hits ) = $searcher->simple_search_compat( $searchstr, 0, $max_results );
964
        $self->{_volumes} = $results if ( defined($results) && scalar(@$results) );
965
    }
966
967
    return $self->{_volumes} || [];
968
}
969
970
=head2 get_volumes_query
971
972
Returns a query which can be used to search for all component parts of MARC21 biblios
973
974
=cut
975
976
sub get_volumes_query {
977
    my ($self) = @_;
978
979
    my $marc = $self->metadata->record;
980
981
    my $searchstr;
982
    if ( C4::Context->preference('UseControlNumber') ) {
983
        my $pf001 = $marc->field('001') || undef;
984
985
        if ( defined($pf001) ) {
986
            $searchstr = "(";
987
            my $pf003 = $marc->field('003') || undef;
988
989
            if ( !defined($pf003) ) {
990
                # search for 773$w='Host001'
991
                $searchstr .= "rcn:" . $pf001->data();
992
            }
993
            else {
994
                $searchstr .= "(";
995
                # search for (773$w='Host001' and 003='Host003') or 773$w='(Host003)Host001'
996
                $searchstr .= "(rcn:" . $pf001->data() . " AND cni:" . $pf003->data() . ")";
997
                $searchstr .= " OR rcn:\"" . $pf003->data() . " " . $pf001->data() . "\"";
998
                $searchstr .= ")";
999
            }
1000
1001
            # exclude monograph and serial component part records
1002
            $searchstr .= " NOT (bib-level:a OR bib-level:b)";
1003
            $searchstr .= ")";
1004
        }
1005
    }
1006
    else {
1007
        my $cleaned_title = $marc->title;
1008
        $cleaned_title =~ tr|/||;
1009
        $searchstr = "ti,phr:($cleaned_title)";
1010
    }
1011
1012
    return $searchstr;
1013
}
1014
945
=head2 Internal methods
1015
=head2 Internal methods
946
1016
947
=head3 type
1017
=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 => 16;
20
use Test::More tests => 17;
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 503-508 subtest 'suggestions() tests' => sub { Link Here
503
    $schema->storage->txn_rollback;
503
    $schema->storage->txn_rollback;
504
};
504
};
505
505
506
subtest 'get_volumes_query' => sub {
507
    plan tests => 3;
508
509
    my $biblio = $builder->build_sample_biblio();
510
    my $biblionumber = $biblio->biblionumber;
511
    my $record = $biblio->metadata->record;
512
513
    t::lib::Mocks::mock_preference( 'UseControlNumber', '0' );
514
    is($biblio->get_volumes_query, "ti,phr:(Some boring read)", "UseControlNumber disabled");
515
516
    t::lib::Mocks::mock_preference( 'UseControlNumber', '1' );
517
    my $marc_001_field = MARC::Field->new('001', $biblionumber);
518
    $record->append_fields($marc_001_field);
519
    C4::Biblio::ModBiblio( $record, $biblio->biblionumber );
520
    $biblio = Koha::Biblios->find( $biblio->biblionumber);
521
522
    is($biblio->get_volumes_query, "rcn:$biblionumber NOT (bib-level:a OR bib-level:b)", "UseControlNumber enabled without MarcOrgCode");
523
524
    my $marc_003_field = MARC::Field->new('003', 'OSt');
525
    $record->append_fields($marc_003_field);
526
    C4::Biblio::ModBiblio( $record, $biblio->biblionumber );
527
    $biblio = Koha::Biblios->find( $biblio->biblionumber);
528
529
    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");
530
};
531
506
subtest 'orders() and active_orders() tests' => sub {
532
subtest 'orders() and active_orders() tests' => sub {
507
533
508
    plan tests => 5;
534
    plan tests => 5;
509
- 

Return to bug 26314