From 76634264faeef65fc0f700d6c64ae36779bd59d7 Mon Sep 17 00:00:00 2001 From: Martin Renvoize Date: Wed, 10 Jul 2024 12:22:06 +0100 Subject: [PATCH] Bug 29560: (follow-up) Split prepare and store logic This allows for future removal of C4::Biblio::prepare_marc_host by splitting the logic for generating the host field and storing the link in the child record. --- Koha/Biblio.pm | 174 ++++++++++++++++++++++++++++++------------------- 1 file changed, 106 insertions(+), 68 deletions(-) diff --git a/Koha/Biblio.pm b/Koha/Biblio.pm index 614406d2041..4a8aa803499 100644 --- a/Koha/Biblio.pm +++ b/Koha/Biblio.pm @@ -1764,163 +1764,201 @@ sub get_marc_hostinfo_only { return $hostinfo; } -=head3 link_marc_host +=head3 generate_marc_host_field -=cut + my $link_field = $biblio->generate_marc_host_field; + $child->link_marc_host( $link_field ); -sub link_marc_host { - my ( $self, $params ) = @_; +This method generates a MARC link field from the biblio that can be added to child +records to link them to the host record. - my $host = Koha::Biblios->find( $params->{biblionumber} ); - return unless $host; +NOTE: This replicates and partially enhances C4::Biblio::prepare_marc_host(). We should merge +functionality from C4::Biblio::PrepareMarcHost() too and then replace all calls to those methods +with this one and remove those alternatives from the codebase. + +=cut + +sub generate_marc_host_field { + my ($self) = @_; my $marcflavour = C4::Context->preference('marcflavour'); - my $marc_host = $host->metadata->record; + my $marc_host = $self->metadata->record; my %sfd; - my $field; my $host_field; + my $link_field; if ( $marcflavour eq 'MARC21' ) { + # Author - if ( $field = - $marc_host->field('100') || $marc_host->field('110') || $marc_host->field('111') ) - { - my $s = $field->as_string('ab'); + if ( $host_field = $marc_host->field('100') || $marc_host->field('110') || $marc_host->field('111') ) { + my $s = $host_field->as_string('ab'); if ($s) { $sfd{a} = $s; } } - # Title - if ( $field = $marc_host->field('245') ) { - my $s = $field->as_string('ab'); + + # Edition + if ( $host_field = $marc_host->field('250') ) { + my $s = $host_field->as_string('ab'); if ($s) { - $sfd{t} = $s; + $sfd{b} = $s; } } - # Uniform title - if ( $field = $marc_host->field('240') ) { - my $s = $field->as_string('a'); + + # Publication + if ( $host_field = $marc_host->field('260') ) { + my $s = $host_field->as_string('abc'); if ($s) { - $sfd{s} = $s; + $sfd{d} = $s; } } - # Publication - if ( $field = $marc_host->field('260') ) { - my $s = $field->as_string('abc'); + + # Uniform title + if ( $host_field = $marc_host->field('240') ) { + my $s = $host_field->as_string('a'); if ($s) { - $sfd{d} = $s; + $sfd{s} = $s; } } - # Edition - if ( $field = $marc_host->field('250') ) { - my $s = $field->as_string('ab'); + + # Title + if ( $host_field = $marc_host->field('245') ) { + my $s = $host_field->as_string('ab'); if ($s) { - $sfd{b} = $s; + $sfd{t} = $s; } } + # ISSN - if ( $field = $marc_host->field('022') ) { - my $s = $field->as_string('a'); + if ( $host_field = $marc_host->field('022') ) { + my $s = $host_field->as_string('a'); if ($s) { $sfd{x} = $s; } } + # ISBN - if ( $field = $marc_host->field('020') ) { - my $s = $field->as_string('a'); + if ( $host_field = $marc_host->field('020') ) { + my $s = $host_field->as_string('a'); if ($s) { $sfd{z} = $s; } } if ( C4::Context->preference('UseControlNumber') ) { + # Control number - if ( $field = $marc_host->field('001') ) { - $sfd{w} = $field->data(),; + if ( $host_field = $marc_host->field('001') ) { + $sfd{w} = $host_field->data(),; } + # Control number identifier - if ( $field = $marc_host->field('003') ) { - $sfd{w} = '('.$field->data().')'.$sfd{w}; + if ( $host_field = $marc_host->field('003') ) { + $sfd{w} = '(' . $host_field->data() . ')' . $sfd{w}; } } - $host_field = MARC::Field->new( 773, '0', ' ', %sfd ); - } - elsif ( $marcflavour eq 'UNIMARC' ) { + $link_field = MARC::Field->new( 773, '0', ' ', %sfd ); + } elsif ( $marcflavour eq 'UNIMARC' ) { #author - if ( $field = - $marc_host->field('700') || $marc_host->field('710') || $marc_host->field('720') ) - { - my $s = $field->as_string('ab'); + if ( $host_field = $marc_host->field('700') || $marc_host->field('710') || $marc_host->field('720') ) { + my $s = $host_field->as_string('ab'); if ($s) { $sfd{a} = $s; } } - #title - if ( $field = $marc_host->field('200') ) { - my $s = $field->as_string('a'); - if ($s) { - $sfd{t} = $s; - } - } - #place of publicaton - if ( $field = $marc_host->field('210') ) { - my $s = $field->as_string('a'); + if ( $host_field = $marc_host->field('210') ) { + my $s = $host_field->as_string('a'); if ($s) { $sfd{c} = $s; } } #date of publication - if ( $field = $marc_host->field('210') ) { - my $s = $field->as_string('d'); + if ( $host_field = $marc_host->field('210') ) { + my $s = $host_field->as_string('d'); if ($s) { $sfd{d} = $s; } } #edition statement - if ( $field = $marc_host->field('205') ) { - my $s = $field->as_string(); + if ( $host_field = $marc_host->field('205') ) { + my $s = $host_field->as_string(); if ($s) { $sfd{e} = $s; } } + #title + if ( $host_field = $marc_host->field('200') ) { + my $s = $host_field->as_string('a'); + if ($s) { + $sfd{t} = $s; + } + } + #URL - if ( $field = $marc_host->field('856') ) { - my $s = $field->as_string('u'); + if ( $host_field = $marc_host->field('856') ) { + my $s = $host_field->as_string('u'); if ($s) { $sfd{u} = $s; } } #ISSN - if ( $field = $marc_host->field('011') ) { - my $s = $field->as_string('a'); + if ( $host_field = $marc_host->field('011') ) { + my $s = $host_field->as_string('a'); if ($s) { $sfd{x} = $s; } } #ISBN - if ( $field = $marc_host->field('010') ) { - my $s = $field->as_string('a'); + if ( $host_field = $marc_host->field('010') ) { + my $s = $host_field->as_string('a'); if ($s) { $sfd{y} = $s; } } - if ( $field = $marc_host->field('001') ) { - $sfd{0} = $field->data(),; + if ( $host_field = $marc_host->field('001') ) { + $sfd{0} = $host_field->data(),; } - $host_field = MARC::Field->new( 461, '0', ' ', %sfd ); + $link_field = MARC::Field->new( 461, '0', ' ', %sfd ); + } + + return $link_field; +} + +=head3 link_marc_host + + $biblio->link_marc_host({ field => $link_field}); + $biblio->link_marc_host({ host => $biblio }); + $biblio->link_marc_host({ host => $biblionumber }); + +Links a child marc record to the parent. Expects either a pre-formed link field as generated by +$parent->get_link_field, the biblio object or biblionumber of the host to link to. + +=cut + +sub link_marc_host { + my ( $self, $params ) = @_; + + my $host_link_field; + if ( $params->{field} ) { + $host_link_field = $params->{field}; + } elsif ( ref( $params->{host} ) eq 'Koha::Biblio' ) { + $host_link_field = $params->{host}->generate_marc_host_field; + } else { + my $host = Koha::Biblios->find( $params->{host} ); + $host_link_field = $host->generate_marc_host_field; } my $marc_record = $self->metadata->record; - $marc_record->append_fields($host_field); + $marc_record->append_fields($host_link_field); - C4::Biblio::ModBiblioMarc($marc_record, $self->biblionumber); + C4::Biblio::ModBiblioMarc( $marc_record, $self->biblionumber ); return $self; } -- 2.45.2