Bug 37305: Subfield order matters

This patch updates the use of a hash to store and then pass subfields to
the MARC::Field new method to an array with key/value pairs using fat comma's.

This allows us to maintain the integrity check that we're passing string
as the first arguament in each pair whilst also allowing us to ensure
fields are passed in the order they are found.

Sponsored-by: Open Fifth <https://openfifth.co.uk>
Signed-off-by: Heather Hernandez <flyingendpaper@gmail.com>
Signed-off-by: Martin Renvoize <martin.renvoize@openfifth.co.uk>
Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
(cherry picked from commit 3d9778b2cd)
Signed-off-by: Paul Derscheid <paul.derscheid@lmscloud.de>
This commit is contained in:
Martin Renvoize 2024-07-17 10:51:01 +01:00 committed by Paul Derscheid
parent 70d23cc9f8
commit ac2ca31d87
No known key found for this signature in database
GPG Key ID: C25F9FD44CED595B
1 changed files with 56 additions and 49 deletions

View File

@ -1921,7 +1921,7 @@ sub generate_marc_host_field {
my $marcflavour = C4::Context->preference('marcflavour');
my $marc_host = $self->metadata->record;
my %sfd;
my @sfd;
my $host_field;
my $link_field;
@ -1931,19 +1931,20 @@ sub generate_marc_host_field {
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;
push @sfd, ( a => $s );
}
}
# Edition
if ( $host_field = $marc_host->field('250') ) {
my $s = $host_field->as_string('ab');
# Title
if ( $host_field = $marc_host->field('245') ) {
my $s = $host_field->as_string('abnp');
if ($s) {
$sfd{b} = $s;
push @sfd, ( t => $s );
}
}
# Publication
my $p;
my @publication_fields = $marc_host->field('264');
@publication_fields = $marc_host->field('260') unless (@publication_fields);
my $index = 0;
@ -1953,32 +1954,33 @@ sub generate_marc_host_field {
if ( $index == 0 ) {
my $s = $host_field->as_string('abc');
if ($s) {
$sfd{d} = $s;
$p = $s;
}
$index++;
}
if ( $host_field->indicator(1) && ( $host_field->indicator(1) eq '3' ) ) {
my $s = $host_field->as_string('abc');
if ($s) {
$sfd{d} = $s;
$p = $s;
}
last;
}
}
push @sfd, ( d => $p ) if $p;
# Uniform title
if ( $host_field = $marc_host->field('240') ) {
my $s = $host_field->as_string('a');
if ($s) {
$sfd{s} = $s;
push @sfd, ( s => $s );
}
}
# Title
if ( $host_field = $marc_host->field('245') ) {
my $s = $host_field->as_string('abnp');
# Edition
if ( $host_field = $marc_host->field('250') ) {
my $s = $host_field->as_string('ab');
if ($s) {
$sfd{t} = $s;
push @sfd, ( b => $s );
}
}
@ -1986,7 +1988,7 @@ sub generate_marc_host_field {
if ( $host_field = $marc_host->field('022') ) {
my $s = $host_field->as_string('a');
if ($s) {
$sfd{x} = $s;
push @sfd, ( x => $s );
}
}
@ -1994,53 +1996,33 @@ sub generate_marc_host_field {
if ( $host_field = $marc_host->field('020') ) {
my $s = $host_field->as_string('a');
if ($s) {
$sfd{z} = $s;
push @sfd, ( z => $s );
}
}
if ( C4::Context->preference('UseControlNumber') ) {
my $w;
# Control number
if ( $host_field = $marc_host->field('001') ) {
$sfd{w} = $host_field->data();
$w = $host_field->data();
}
# Control number identifier
if ( $host_field = $marc_host->field('003') ) {
$sfd{w} = '(' . $host_field->data() . ')' . $sfd{w};
$w = '(' . $host_field->data() . ')' . $w;
}
push @sfd, ( w => $w );
}
$link_field = MARC::Field->new( 773, '0', ' ', %sfd );
$link_field = MARC::Field->new( 773, '0', ' ', @sfd );
} elsif ( $marcflavour eq 'UNIMARC' ) {
# Author
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;
}
}
# Place of publication
if ( $host_field = $marc_host->field('210') ) {
my $s = $host_field->as_string('a');
if ($s) {
$sfd{c} = $s;
}
}
# Date of publication
if ( $host_field = $marc_host->field('210') ) {
my $s = $host_field->as_string('d');
if ($s) {
$sfd{d} = $s;
}
}
# Edition statement
if ( $host_field = $marc_host->field('205') ) {
my $s = $host_field->as_string();
if ($s) {
$sfd{e} = $s;
push @sfd, ( a => $s );
}
}
@ -2048,7 +2030,31 @@ sub generate_marc_host_field {
if ( $host_field = $marc_host->field('200') ) {
my $s = $host_field->as_string('a');
if ($s) {
$sfd{t} = $s;
push @sfd, ( t => $s );
}
}
# Place of publication
if ( $host_field = $marc_host->field('210') ) {
my $s = $host_field->as_string('a');
if ($s) {
push @sfd, ( c => $s );
}
}
# Date of publication
if ( $host_field = $marc_host->field('210') ) {
my $s = $host_field->as_string('d');
if ($s) {
push @sfd, ( d => $s );
}
}
# Edition statement
if ( $host_field = $marc_host->field('205') ) {
my $s = $host_field->as_string();
if ($s) {
push @sfd, ( e => $s );
}
}
@ -2056,7 +2062,7 @@ sub generate_marc_host_field {
if ( $host_field = $marc_host->field('856') ) {
my $s = $host_field->as_string('u');
if ($s) {
$sfd{u} = $s;
push @sfd, ( u => $s );
}
}
@ -2064,7 +2070,7 @@ sub generate_marc_host_field {
if ( $host_field = $marc_host->field('011') ) {
my $s = $host_field->as_string('a');
if ($s) {
$sfd{x} = $s;
push @sfd, ( x => $s );
}
}
@ -2072,13 +2078,14 @@ sub generate_marc_host_field {
if ( $host_field = $marc_host->field('010') ) {
my $s = $host_field->as_string('a');
if ($s) {
$sfd{y} = $s;
push @sfd, ( y => $s );
}
}
if ( $host_field = $marc_host->field('001') ) {
$sfd{0} = $host_field->data();
push @sfd, ( 0 => $host_field->data() );
}
$link_field = MARC::Field->new( 461, '0', ' ', %sfd );
$link_field = MARC::Field->new( 461, '0', ' ', @sfd );
}
return $link_field;