GetMarcISBN
GetMarcISSN
GetMarcSubjects
- GetMarcAuthors
GetMarcSeries
GetMarcUrls
GetUsedMarcStructure
return \@marcsubjects;
} #end getMARCsubjects
-=head2 GetMarcAuthors
-
- authors = GetMarcAuthors($record,$marcflavour);
-
-Get all authors from the MARC record and returns them in an array.
-The authors are stored in different fields depending on MARC flavour
-
-=cut
-
-sub GetMarcAuthors {
- my ( $record, $marcflavour ) = @_;
- if (!$record) {
- carp 'GetMarcAuthors called on undefined record';
- return;
- }
- my ( $mintag, $maxtag, $fields_filter );
-
- # tagslib useful only for UNIMARC author responsibilities
- my $tagslib;
- if ( $marcflavour eq "UNIMARC" ) {
- # FIXME : we don't have the framework available, we take the default framework. May be buggy on some setups, will be usually correct.
- $tagslib = GetMarcStructure( 1, '', { unsafe => 1 });
- $mintag = "700";
- $maxtag = "712";
- $fields_filter = '7..';
- } else { # marc21
- $mintag = "700";
- $maxtag = "720";
- $fields_filter = '7..';
- }
-
- my @marcauthors;
- 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 @link_loop;
- my @subfields = $field->subfields();
- my $count_auth = 0;
-
- # if there is an authority link, build the link with Koha-Auth-Number: subfield9
- my $subfield9 = $field->subfield('9');
- if ($subfield9) {
- my $linkvalue = $subfield9;
- $linkvalue =~ s/(\(|\))//g;
- @link_loop = ( { 'limit' => 'an', 'link' => $linkvalue } );
- }
-
- # other subfields
- my $unimarc3;
- for my $authors_subfield (@subfields) {
- next if ( $authors_subfield->[0] eq '9' );
-
- # unimarc3 contains the $3 of the author for UNIMARC.
- # For french academic libraries, it's the "ppn", and it's required for idref webservice
- $unimarc3 = $authors_subfield->[1] if $marcflavour eq 'UNIMARC' and $authors_subfield->[0] =~ /3/;
-
- # don't load unimarc subfields 3, 5
- next if ( $marcflavour eq 'UNIMARC' and ( $authors_subfield->[0] =~ /3|5/ ) );
-
- my $code = $authors_subfield->[0];
- my $value = $authors_subfield->[1];
- my $linkvalue = $value;
- $linkvalue =~ s/(\(|\))//g;
- # UNIMARC author responsibility
- if ( $marcflavour eq 'UNIMARC' and $code eq '4' ) {
- $value = GetAuthorisedValueDesc( $field->tag(), $code, $value, '', $tagslib );
- $linkvalue = "($value)";
- }
- # if no authority link, build a search query
- unless ($subfield9) {
- push @link_loop, {
- limit => 'au',
- '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 @marcauthors, {
- MARCAUTHOR_SUBFIELDS_LOOP => \@subfields_loop,
- authoritylink => $subfield9,
- unimarc3 => $unimarc3
- };
- }
- return \@marcauthors;
-}
-
=head2 GetMarcUrls
$marcurls = GetMarcUrls($record,$marcflavour);
return \@marcnotes;
}
+=head3 get_authors_from_MARC
+
+ my $authors = $biblio->get_authors_from_MARC;
+
+Get all authors from the MARC record and returns them in an array.
+The authors are stored in different fields depending on MARC flavour
+
+=cut
+
+sub get_authors_from_MARC {
+ my ( $self, $params ) = @_;
+
+ my ( $mintag, $maxtag, $fields_filter );
+ my $marcflavour = C4::Context->preference('marcflavour');
+
+ # tagslib useful only for UNIMARC author responsibilities
+ my $tagslib;
+ if ( $marcflavour eq "UNIMARC" ) {
+ # FIXME : we don't have the framework available, we take the default framework. May be buggy on some setups, will be usually correct.
+ $tagslib = C4::Biblio::GetMarcStructure( 1, '', { unsafe => 1 });
+ $mintag = "700";
+ $maxtag = "712";
+ $fields_filter = '7..';
+ } else { # marc21/normarc
+ $mintag = "700";
+ $maxtag = "720";
+ $fields_filter = '7..';
+ }
+
+ my @marcauthors;
+ 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 @link_loop;
+ my @subfields = $field->subfields();
+ my $count_auth = 0;
+
+ # if there is an authority link, build the link with Koha-Auth-Number: subfield9
+ my $subfield9 = $field->subfield('9');
+ if ($subfield9) {
+ my $linkvalue = $subfield9;
+ $linkvalue =~ s/(\(|\))//g;
+ @link_loop = ( { 'limit' => 'an', 'link' => $linkvalue } );
+ }
+
+ # other subfields
+ my $unimarc3;
+ for my $authors_subfield (@subfields) {
+ next if ( $authors_subfield->[0] eq '9' );
+
+ # unimarc3 contains the $3 of the author for UNIMARC.
+ # For french academic libraries, it's the "ppn", and it's required for idref webservice
+ $unimarc3 = $authors_subfield->[1] if $marcflavour eq 'UNIMARC' and $authors_subfield->[0] =~ /3/;
+
+ # don't load unimarc subfields 3, 5
+ next if ( $marcflavour eq 'UNIMARC' and ( $authors_subfield->[0] =~ /3|5/ ) );
+
+ my $code = $authors_subfield->[0];
+ my $value = $authors_subfield->[1];
+ my $linkvalue = $value;
+ $linkvalue =~ s/(\(|\))//g;
+ # UNIMARC author responsibility
+ if ( $marcflavour eq 'UNIMARC' and $code eq '4' ) {
+ $value = C4::Biblio::GetAuthorisedValueDesc( $field->tag(), $code, $value, '', $tagslib );
+ $linkvalue = "($value)";
+ }
+ # if no authority link, build a search query
+ unless ($subfield9) {
+ push @link_loop, {
+ limit => 'au',
+ '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 @marcauthors, {
+ MARCAUTHOR_SUBFIELDS_LOOP => \@subfields_loop,
+ authoritylink => $subfield9,
+ unimarc3 => $unimarc3
+ };
+ }
+ return \@marcauthors;
+}
+
=head3 to_api
my $json = $biblio->to_api;
my $biblio = Koha::Biblios->find( $biblionumber );
my $record = &GetMarcBiblio({ biblionumber => $biblionumber });
my $marcnotesarray = $biblio->get_marc_notes({ marcflavour => $marcflavour });
- my $marcauthorsarray = GetMarcAuthors( $record, $marcflavour );
+ my $marcauthorsarray = $biblio->get_authors_from_MARC;
my $marcsubjctsarray = GetMarcSubjects( $record, $marcflavour );
my $marcseriesarray = GetMarcSeries ($record,$marcflavour);
my $marcurlsarray = GetMarcUrls ($record,$marcflavour);
my $dat = GetBiblioData($biblionumber);
next unless $dat;
+ my $biblio = Koha::Biblios->find( $biblionumber );
my $record = GetMarcBiblio({
biblionumber => $biblionumber,
embed_items => 1 });
- my $marcauthorsarray = GetMarcAuthors( $record, $marcflavour );
+ my $marcauthorsarray = $biblio->get_authors_from_MARC;
my $marcsubjctsarray = GetMarcSubjects( $record, $marcflavour );
my @items = GetItemsInfo( $biblionumber );
$record_processor->process($record);
next unless $record;
my $marcnotesarray = $biblio->get_marc_notes({ marcflavour => $marcflavour, opac => 1 });
- my $marcauthorsarray = GetMarcAuthors( $record, $marcflavour );
+ my $marcauthorsarray = $biblio->get_authors_from_MARC;
my $marcsubjctsarray = GetMarcSubjects( $record, $marcflavour );
my $marcseriesarray = GetMarcSeries ($record,$marcflavour);
my $marcurlsarray = GetMarcUrls ($record,$marcflavour);
}
my $marcnotesarray = $biblio->get_marc_notes({ marcflavour => $marcflavour, opac => 1 });
+my $marcauthorsarray = $biblio->get_authors_from_MARC;
if( C4::Context->preference('ArticleRequests') ) {
my $patron = $borrowernumber ? Koha::Patrons->find($borrowernumber) : undef;
my $norequests = ! $biblio->items->filter_by_for_hold->count;
$template->param(
MARCNOTES => $marcnotesarray,
+ MARCAUTHORS => $marcauthorsarray,
norequests => $norequests,
itemdata_ccode => $itemfields{ccode},
itemdata_materials => $itemfields{materials},
my $dat = GetBiblioData($biblionumber);
next unless $dat;
+ my $biblio = Koha::Biblios->find( $biblionumber );
my $record = GetMarcBiblio({
biblionumber => $biblionumber,
embed_items => 1,
opac => 1,
borcat => $borcat });
- my $marcauthorsarray = GetMarcAuthors( $record, $marcflavour );
+ my $marcauthorsarray = $biblio->get_authors_from_MARC;
my $marcsubjctsarray = GetMarcSubjects( $record, $marcflavour );
my @items = GetItemsInfo( $biblionumber );
opac => 1,
borcat => $borcat });
next unless $record;
+ my $biblio = Koha::Biblios->find( $biblionumber );
my $fw = GetFrameworkCode($biblionumber);
my $dat = GetBiblioData($biblionumber);
- my $marcauthorsarray = GetMarcAuthors( $record, $marcflavour );
+ my $marcauthorsarray = $biblio->get_authors_from_MARC;
my $marcsubjctsarray = GetMarcSubjects( $record, $marcflavour );
my @items = GetItemsInfo( $biblionumber );
use Test::MockModule;
use Test::Warn;
-plan tests => 39;
+plan tests => 37;
use_ok('C4::Biblio', qw( AddBiblio ModBiblio BiblioAutoLink LinkBibHeadingsToAuthorities GetMarcPrice GetMarcQuantity GetMarcControlnumber GetMarcISBN GetMarcISSN GetMarcSubjects GetMarcAuthors GetMarcUrls GetMarcSeries TransformMarcToKoha ModBiblioMarc RemoveAllNsb GetMarcBiblio UpdateTotalIssues ));
ok( !defined $ret, 'GetMarcSubjects returns undef if not passed rec');
-warning_is { $ret = GetMarcAuthors() }
- { carped => 'GetMarcAuthors called on undefined record'},
- "GetMarcAuthors returns carped warning on undef record";
-
-ok( !defined $ret, 'GetMarcAuthors returns undef if not passed rec');
-
warning_is { $ret = GetMarcUrls() }
{ carped => 'GetMarcUrls called on undefined record'},
"GetMarcUrls returns carped warning on undef record";
use Modern::Perl;
-use Test::More tests => 19;
+use Test::More tests => 20;
use Test::Warn;
use C4::Biblio qw( AddBiblio ModBiblio ModBiblioMarc );
$schema->storage->txn_rollback;
};
+subtest 'get_authors_from_MARC() 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('700','1','','a' => 'Jefferson, Thomas');
+ $record->append_fields($field);
+ $field = MARC::Field->new('700','1','','d' => '1743-1826');
+ $record->append_fields($field);
+ $field = MARC::Field->new('700','1','','e' => 'former owner.');
+ $record->append_fields($field);
+ $field = MARC::Field->new('700','1','','5' => 'MH');
+ $record->append_fields($field);
+
+ # get record
+ C4::Biblio::ModBiblio( $record, $biblio->biblionumber );
+ $biblio = Koha::Biblios->find( $biblio->biblionumber );
+
+ is( 4, @{$biblio->get_authors_from_MARC}, 'get_authors_from_MARC retrieves correct number of author subfields' );
+
+ $schema->storage->txn_rollback;
+};
+
sub component_record1 {
my $marc = MARC::Record->new;
$marc->append_fields(
while ( my $content = $contents->next ) {
my $biblionumber = $content->biblionumber;
+ my $biblio = Koha::Biblios->find( $biblionumber );
my $dat = GetBiblioData($biblionumber);
my $record = GetMarcBiblio({
biblionumber => $biblionumber,
embed_items => 1 });
- my $marcauthorsarray = GetMarcAuthors( $record, $marcflavour );
+ my $marcauthorsarray = $biblio->get_authors_from_MARC;
my $marcsubjctsarray = GetMarcSubjects( $record, $marcflavour );
my @items = GetItemsInfo($biblionumber);