@@ -, +, @@ the biblio detail page. You should see a list of component part records on the detail page. --- C4/Search.pm | 2 + C4/XSLT.pm | 19 ++++++- Koha/Biblio.pm | 41 ++++++++++++++ Koha/QueryParser/Driver/PQF.pm | 2 + etc/searchengine/queryparser.yaml | 10 ++++ etc/zebradb/biblios/etc/bib1.att | 1 + etc/zebradb/ccl.properties | 3 + .../marc21/biblios/biblio-koha-indexdefs.xml | 3 + .../marc21/biblios/biblio-zebra-indexdefs.xsl | 5 ++ .../intranet-tmpl/prog/css/src/staff-global.scss | 8 +++ .../prog/en/xslt/MARC21slim2intranetDetail.xsl | 2 + .../intranet-tmpl/prog/en/xslt/MARC21slimUtils.xsl | 66 ++++++++++++++++++++++ t/QueryParser.t | 2 +- 13 files changed, 162 insertions(+), 2 deletions(-) --- a/C4/Search.pm +++ a/C4/Search.pm @@ -1121,6 +1121,8 @@ sub getIndexes{ 'Conference-name-seealso', 'Content-type', 'Control-number', + 'Control-number-identifier', + 'cni', 'copydate', 'Corporate-name', 'Corporate-name-heading', --- a/C4/XSLT.pm +++ a/C4/XSLT.pm @@ -243,7 +243,24 @@ sub XSLTParse4Display { my $itemsxml = buildKohaItemsNamespace($biblionumber, $hidden_items); my $xmlrecord = $record->as_xml(C4::Context->preference('marcflavour')); - $xmlrecord =~ s/\<\/record\>/$itemsxml$sysxml\<\/record\>/; + my $partsxml = ''; + # Add component part records only for Detail view + if ( $xslsyspref =~ m/Details/ ) { + my $biblio = Koha::Biblios->find( $biblionumber ); + if ( $biblio->components() ) { + my @componentPartRecordXML = (''); + for my $cb ( @{ $biblio->components() } ) { + # Remove the xml header + $cb =~ s/^<\?xml.*?\?>//; + push @componentPartRecordXML, decode('utf8', $cb); + } + push @componentPartRecordXML, ''; + + $partsxml = join "\n", @componentPartRecordXML; + } + } + + $xmlrecord =~ s/\<\/record\>/$itemsxml$sysxml$partsxml\<\/record\>/; if ($fixamps) { # We need to correct the HTML entities that Zebra outputs $xmlrecord =~ s/\&amp;/\&/g; $xmlrecord =~ s/\&\;lt\;/\<\;/g; --- a/Koha/Biblio.pm +++ a/Koha/Biblio.pm @@ -36,6 +36,8 @@ use Koha::IssuingRules; use Koha::Item::Transfer::Limits; use Koha::Libraries; use Koha::Subscriptions; +use Koha::SearchEngine; +use Koha::SearchEngine::Search; =head1 NAME @@ -386,6 +388,45 @@ sub biblioitem { return $self->{_biblioitem}; } +=head3 components + +my $components = $self->components(); + +Returns an array of MARCXML data, which are component parts of +this object (MARC21 773$w points to this) + +=cut + +sub components { + my ($self) = @_; + + return undef if (C4::Context->preference('marcflavour') ne 'MARC21'); + + if (!defined($self->{_components})) { + my $marc = C4::Biblio::GetMarcBiblio({ biblionumber => $self->id }); + my $pf001 = $marc->field('001') || undef; + my $pf003 = $marc->field('003') || undef; + + my $searcher = Koha::SearchEngine::Search->new({index => $Koha::SearchEngine::BIBLIOS_INDEX}); + + if (defined($pf001)) { + # search for (773$w='Host001' and 003='Host003') or 773$w='Host003 Host001') + my $searchstr = "(rcn='".$pf001->data()."'"; + $searchstr .= " and cni='".$pf003->data()."'" if (defined($pf003)); + $searchstr .= ")"; + $searchstr .= " or rcn='".$pf003->data()." ".$pf001->data()."'" if (defined($pf003)); + + my ( $errors, $results, $total_hits ) = $searcher->simple_search_compat( $searchstr, 0, undef ); + + $self->{_components} = $results if ( defined($results) && scalar(@$results) ); + } else { + warn "Record $self->id has no 001"; + } + } + + return $self->{_components}; +} + =head3 subscriptions my $subscriptions = $self->subscriptions --- a/Koha/QueryParser/Driver/PQF.pm +++ a/Koha/QueryParser/Driver/PQF.pm @@ -727,6 +727,8 @@ sub TEST_SETUP { $self->add_search_field_alias( 'keyword' => 'note' => 'nt' ); $self->add_bib1_field_map('keyword' => 'record-control-number' => 'biblioserver' => { '1' => '1045' } ); $self->add_search_field_alias( 'keyword' => 'record-control-number' => 'rcn' ); + $self->add_bib1_field_map('keyword' => 'control-number-identifier' => 'biblioserver' => { '1' => '9014' } ); + $self->add_search_field_alias( 'keyword' => 'control-number-identifier' => 'cni' ); $self->add_bib1_field_map('subject' => '' => 'biblioserver' => { '1' => '21' } ); $self->add_search_field_alias( 'subject' => '' => 'su' ); $self->add_search_field_alias( 'subject' => '' => 'su-to' ); --- a/etc/searchengine/queryparser.yaml +++ a/etc/searchengine/queryparser.yaml @@ -321,6 +321,16 @@ field_mappings: aliases: - control-number label: Control-number + control-number-identifier: + bib1_mapping: + biblioserver: + 1: 9014 + enabled: 1 + index: control-number-identifier + aliases: + - control-number-identifier + - cni + label: Control-number-identifier copynumber: bib1_mapping: biblioserver: --- a/etc/zebradb/biblios/etc/bib1.att +++ a/etc/zebradb/biblios/etc/bib1.att @@ -221,6 +221,7 @@ att 9010 cn-suffix att 9011 Suppress att 9012 Identifier-other att 9013 not-onloan-count +att 9014 Control-number-identifier # Items Index att 8001 withdrawn --- a/etc/zebradb/ccl.properties +++ a/etc/zebradb/ccl.properties @@ -996,6 +996,9 @@ llength 1=llength Summary 1=Summary not-onloan-count 1=9013 4=109 +Control-number-identifier 1=9014 +cni Control-number-identifier + ### # Items Index withdrawn 1=8001 --- a/etc/zebradb/marc_defs/marc21/biblios/biblio-koha-indexdefs.xml +++ a/etc/zebradb/marc_defs/marc21/biblios/biblio-koha-indexdefs.xml @@ -16,6 +16,9 @@ Control-number:w + + Control-number-identifier:w + Date/time-last-modified:w --- a/etc/zebradb/marc_defs/marc21/biblios/biblio-zebra-indexdefs.xsl +++ a/etc/zebradb/marc_defs/marc21/biblios/biblio-zebra-indexdefs.xsl @@ -62,6 +62,11 @@ definition file (probably something like {biblio,authority}-koha-indexdefs.xml) + + + + + --- a/koha-tmpl/intranet-tmpl/prog/css/src/staff-global.scss +++ a/koha-tmpl/intranet-tmpl/prog/css/src/staff-global.scss @@ -721,6 +721,14 @@ ol { } } +.componentPartRecordsContainer { + float: right; + overflow-y: auto; + overflow-x: hidden; + max-width: 50%; + max-height: 25em; +} + #editions { table, td { --- a/koha-tmpl/intranet-tmpl/prog/en/xslt/MARC21slim2intranetDetail.xsl +++ a/koha-tmpl/intranet-tmpl/prog/en/xslt/MARC21slim2intranetDetail.xsl @@ -110,6 +110,8 @@ + +

--- a/koha-tmpl/intranet-tmpl/prog/en/xslt/MARC21slimUtils.xsl +++ a/koha-tmpl/intranet-tmpl/prog/en/xslt/MARC21slimUtils.xsl @@ -338,6 +338,72 @@ + + + + + + +