@@ -, +, @@ - t/Biblio.t - t/db_dependent/Koha/Biblio.t --- C4/Biblio.pm | 90 -------------------------------------------- Koha/Biblio.pm | 87 ++++++++++++++++++++++++++++++++++++++++++ basket/basket.pl | 2 +- basket/sendbasket.pl | 2 +- opac/opac-basket.pl | 2 +- opac/opac-detail.pl | 2 + opac/opac-sendbasket.pl | 2 +- opac/opac-sendshelf.pl | 3 +- t/Biblio.t | 8 +--- t/db_dependent/Koha/Biblio.t | 24 +++++++++++- virtualshelves/sendshelf.pl | 2 +- 11 files changed, 120 insertions(+), 104 deletions(-) --- a/C4/Biblio.pm +++ a/C4/Biblio.pm @@ -33,7 +33,6 @@ BEGIN { GetMarcControlnumber GetMarcISBN GetMarcISSN - GetMarcSubjects GetMarcSeries GetMarcUrls GetUsedMarcStructure @@ -1499,95 +1498,6 @@ sub GetMarcISSN { return \@marcissns; } # end GetMarcISSN -=head2 GetMarcSubjects - - $marcsubjcts = GetMarcSubjects($record,$marcflavour); - -Get all subjects from the MARC record and returns them in an array. -The subjects are stored in different fields depending on MARC flavour - -=cut - -sub GetMarcSubjects { - my ( $record, $marcflavour ) = @_; - if (!$record) { - carp 'GetMarcSubjects called on undefined record'; - return; - } - my ( $mintag, $maxtag, $fields_filter ); - if ( $marcflavour eq "UNIMARC" ) { - $mintag = "600"; - $maxtag = "611"; - $fields_filter = '6..'; - } else { # marc21 - $mintag = "600"; - $maxtag = "699"; - $fields_filter = '6..'; - } - - my @marcsubjects; - - my $subject_limit = C4::Context->preference("TraceCompleteSubfields") ? 'su,complete-subfield' : 'su'; - my $AuthoritySeparator = C4::Context->preference('AuthoritySeparator'); - - foreach my $field ( $record->field($fields_filter) ) { - next unless ($field->tag() >= $mintag && $field->tag() <= $maxtag); - my @subfields_loop; - my @subfields = $field->subfields(); - my @link_loop; - - # if there is an authority link, build the links with an= subfield9 - my $subfield9 = $field->subfield('9'); - my $authoritylink; - if ($subfield9) { - my $linkvalue = $subfield9; - $linkvalue =~ s/(\(|\))//g; - @link_loop = ( { limit => 'an', 'link' => $linkvalue } ); - $authoritylink = $linkvalue - } - - # other subfields - for my $subject_subfield (@subfields) { - next if ( $subject_subfield->[0] eq '9' ); - - # don't load unimarc subfields 3,4,5 - next if ( ( $marcflavour eq "UNIMARC" ) and ( $subject_subfield->[0] =~ /2|3|4|5/ ) ); - # don't load MARC21 subfields 2 (FIXME: any more subfields??) - next if ( ( $marcflavour eq "MARC21" ) and ( $subject_subfield->[0] =~ /2/ ) ); - - my $code = $subject_subfield->[0]; - my $value = $subject_subfield->[1]; - my $linkvalue = $value; - $linkvalue =~ s/(\(|\))//g; - # if no authority link, build a search query - unless ($subfield9) { - push @link_loop, { - limit => $subject_limit, - 'link' => $linkvalue, - operator => (scalar @link_loop) ? ' AND ' : undef - }; - } - my @this_link_loop = @link_loop; - # do not display $0 - unless ( $code eq '0' ) { - push @subfields_loop, { - code => $code, - value => $value, - link_loop => \@this_link_loop, - separator => (scalar @subfields_loop) ? $AuthoritySeparator : '' - }; - } - } - - push @marcsubjects, { - MARCSUBJECT_SUBFIELDS_LOOP => \@subfields_loop, - authoritylink => $authoritylink, - } if $authoritylink || @subfields_loop; - - } - return \@marcsubjects; -} #end getMARCsubjects - =head2 GetMarcUrls $marcurls = GetMarcUrls($record,$marcflavour); --- a/Koha/Biblio.pm +++ a/Koha/Biblio.pm @@ -1162,6 +1162,93 @@ sub get_marc_authors { return [@first_authors, @other_authors]; } +=head3 get_marc_subjects + + $marcsubjcts = $biblio->get_marc_subjects({ marcflavour => $marcflavour }); + +Get all subjects from the MARC record and returns them in an array. +The subjects are stored in different fields depending on MARC flavour + +=cut + +sub get_marc_subjects { + my ( $self, $params ) = @_; + my ( $mintag, $maxtag, $fields_filter ); + + my $marcflavour = $params->{marcflavour}; + if ( $marcflavour eq "UNIMARC" ) { + $mintag = "600"; + $maxtag = "611"; + $fields_filter = '6..'; + } else { # marc21/normarc + $mintag = "600"; + $maxtag = "699"; + $fields_filter = '6..'; + } + + my @marcsubjects; + + my $subject_limit = C4::Context->preference("TraceCompleteSubfields") ? 'su,complete-subfield' : 'su'; + my $AuthoritySeparator = C4::Context->preference('AuthoritySeparator'); + + foreach my $field ( $self->metadata->record->field($fields_filter) ) { + next unless ($field->tag() >= $mintag && $field->tag() <= $maxtag); + my @subfields_loop; + my @subfields = $field->subfields(); + my @link_loop; + + # if there is an authority link, build the links with an= subfield9 + my $subfield9 = $field->subfield('9'); + my $authoritylink; + if ($subfield9) { + my $linkvalue = $subfield9; + $linkvalue =~ s/(\(|\))//g; + @link_loop = ( { limit => 'an', 'link' => $linkvalue } ); + $authoritylink = $linkvalue + } + + # other subfields + for my $subject_subfield (@subfields) { + next if ( $subject_subfield->[0] eq '9' ); + + # don't load unimarc subfields 3,4,5 + next if ( ( $marcflavour eq "UNIMARC" ) and ( $subject_subfield->[0] =~ /2|3|4|5/ ) ); + # don't load MARC21 subfields 2 (FIXME: any more subfields??) + next if ( ( $marcflavour eq "MARC21" ) and ( $subject_subfield->[0] =~ /2/ ) ); + + my $code = $subject_subfield->[0]; + my $value = $subject_subfield->[1]; + my $linkvalue = $value; + $linkvalue =~ s/(\(|\))//g; + # if no authority link, build a search query + unless ($subfield9) { + push @link_loop, { + limit => $subject_limit, + 'link' => $linkvalue, + operator => (scalar @link_loop) ? ' and ' : undef + }; + } + my @this_link_loop = @link_loop; + # do not display $0 + unless ( $code eq '0') { + push @subfields_loop, { + tag => $field->tag(), + code => $code, + value => $value, + link_loop => \@this_link_loop, + separator => (scalar @subfields_loop) ? $AuthoritySeparator : '' + }; + } + } + + push @marcsubjects, { + MARCSUBJECT_SUBFIELDS_LOOP => \@subfields_loop, + authoritylink => $authoritylink, + } if $authoritylink || @subfields_loop; + + } + return \@marcsubjects; +} =head3 to_api --- a/basket/basket.pl +++ a/basket/basket.pl @@ -68,7 +68,7 @@ foreach my $biblionumber ( @bibs ) { my $record = $biblio->metadata->record; my $marcnotesarray = $biblio->get_marc_notes; my $marcauthorsarray = $biblio->get_marc_contributors; - my $marcsubjctsarray = GetMarcSubjects( $record, $marcflavour ); + my $marcsubjctsarray = $biblio->get_marc_subjects({ marcflavour => $marcflavour }); my $marcseriesarray = GetMarcSeries ($record,$marcflavour); my $marcurlsarray = GetMarcUrls ($record,$marcflavour); --- a/basket/sendbasket.pl +++ a/basket/sendbasket.pl @@ -73,7 +73,7 @@ if ( $email_add ) { my $dat = $biblio->unblessed; my $record = $biblio->metadata->record({ embed_items => 1 }); my $marcauthorsarray = $biblio->get_marc_contributors; - my $marcsubjctsarray = GetMarcSubjects( $record, $marcflavour ); + my $marcsubjctsarray = $biblio->get_marc_subjects({ marcflavour => $marcflavour }); my $hasauthors = 0; if($dat->{'author'} || @$marcauthorsarray) { --- a/opac/opac-basket.pl +++ a/opac/opac-basket.pl @@ -85,7 +85,7 @@ foreach my $biblionumber ( @bibs ) { next unless $record; my $marcnotesarray = $biblio->get_marc_notes({ opac => 1 }); my $marcauthorsarray = $biblio->get_marc_contributors; - my $marcsubjctsarray = GetMarcSubjects( $record, $marcflavour ); + my $marcsubjctsarray = $biblio->get_marc_subjects({ marcflavour => $marcflavour }); my $marcseriesarray = GetMarcSeries ($record,$marcflavour); my $marcurlsarray = GetMarcUrls ($record,$marcflavour); --- a/opac/opac-detail.pl +++ a/opac/opac-detail.pl @@ -777,6 +777,7 @@ if (scalar(@itemloop) == 0 || scalar(@otheritemloop) == 0) { } my $marcnotesarray = $biblio->get_marc_notes({ opac => 1, record => $record }); +my $marcsubjctsarray = $biblio->get_marc_subjects({ marcflavour => $marcflavour }); if( C4::Context->preference('ArticleRequests') ) { my $patron = $borrowernumber ? Koha::Patrons->find($borrowernumber) : undef; @@ -792,6 +793,7 @@ if( C4::Context->preference('ArticleRequests') ) { my $norequests = ! $biblio->items->filter_by_for_hold->count; $template->param( MARCNOTES => $marcnotesarray, + MARCSUBJCTS => $marcsubjctsarray, norequests => $norequests, itemdata_ccode => $itemfields{ccode}, itemdata_materials => $itemfields{materials}, --- a/opac/opac-sendbasket.pl +++ a/opac/opac-sendbasket.pl @@ -83,7 +83,7 @@ if ( $email_add ) { } ); my $marcauthorsarray = $biblio->get_marc_contributors; - my $marcsubjctsarray = GetMarcSubjects( $record, $marcflavour ); + my $marcsubjctsarray = $biblio->get_marc_subjects({ marcflavour => $marcflavour }); my $items = $biblio->items->search_ordered->filter_by_visible_in_opac({ patron => $patron }); --- a/opac/opac-sendshelf.pl +++ a/opac/opac-sendshelf.pl @@ -89,10 +89,11 @@ if ( $shelf and $shelf->can_be_viewed( $borrowernumber ) ) { } ); next unless $record; + my $biblio = Koha::Biblios->find( $biblionumber ); my $fw = GetFrameworkCode($biblionumber); my $marcauthorsarray = $biblio->get_marc_contributors; - my $marcsubjctsarray = GetMarcSubjects( $record, $marcflavour ); + my $marcsubjctsarray = $biblio->get_marc_subjects({ marcflavour => $marcflavour }); my $items = $biblio->items->search_ordered->filter_by_visible_in_opac({ patron => $patron }); --- a/t/Biblio.t +++ a/t/Biblio.t @@ -21,7 +21,7 @@ use Test::More; use Test::MockModule; use Test::Warn; -plan tests => 34; +plan tests => 32; use_ok('C4::Biblio', qw( AddBiblio ModBiblio BiblioAutoLink LinkBibHeadingsToAuthorities GetMarcPrice GetMarcQuantity GetMarcControlnumber GetMarcISBN GetMarcISSN GetMarcSubjects GetMarcUrls GetMarcSeries TransformMarcToKoha ModBiblioMarc RemoveAllNsb UpdateTotalIssues )); @@ -88,12 +88,6 @@ warning_is { $ret = GetMarcISSN() } ok( !defined $ret, 'GetMarcISSN returns undef if not passed rec'); -warning_is { $ret = GetMarcSubjects() } - { carped => 'GetMarcSubjects called on undefined record'}, - "GetMarcSubjects returns carped warning on undef record"; - -ok( !defined $ret, 'GetMarcSubjects returns undef if not passed rec'); - warning_is { $ret = GetMarcUrls() } { carped => 'GetMarcUrls called on undefined record'}, "GetMarcUrls returns carped warning on undef record"; --- a/t/db_dependent/Koha/Biblio.t +++ a/t/db_dependent/Koha/Biblio.t @@ -17,7 +17,7 @@ use Modern::Perl; -use Test::More tests => 22; # +1 +use Test::More tests => 23; # +1 use Test::Warn; use C4::Biblio qw( AddBiblio ModBiblio ModBiblioMarc ); @@ -1053,6 +1053,28 @@ subtest 'item_groups() tests' => sub { $schema->storage->txn_rollback; }; +subtest 'get_marc_subjects() tests' => sub { + + plan tests => 1; + + $schema->storage->txn_begin; + + my $biblio = $builder->build_sample_biblio; + my $record = $biblio->metadata->record; + + # add author information + my $field = MARC::Field->new('600','1','0','a' => 'Nixon, Richard M.'); + $record->append_fields($field); + $field = MARC::Field->new('600','1','0','q' => '(Richard Milhouse),'); + $record->append_fields($field); + $field = MARC::Field->new('600','1','0','d' => '1913-'); + $record->append_fields($field); + $field = MARC::Field->new('600','1','0','x' => 'Psychology.'); + is( 4, @{$biblio->get_marc_subjects({ marcflavour => 'MARC21' })}, 'get_marc_subjects retrieves correct number of subject subfields' ); + + $schema->storage->txn_rollback; +}; + sub component_record1 { my $marc = MARC::Record->new; $marc->append_fields( --- a/virtualshelves/sendshelf.pl +++ a/virtualshelves/sendshelf.pl @@ -80,7 +80,7 @@ if ($to_address) { my $dat = $biblio->unblessed; my $record = $biblio->metadata->record({ embed_items => 1 }); my $marcauthorsarray = $biblio->get_marc_contributors; - my $marcsubjctsarray = GetMarcSubjects( $record, $marcflavour ); + my $marcsubjctsarray = $biblio->get_marc_subjects({ marcflavour => $marcflavour }); my $items = $biblio->items->search_ordered; --