Bug 29733: MARC21: Link 7xx linking fields to marc21_linking_section.pl value builder

When creating an analytical record from scratch and filling the 773
field with marc21_linking_section.pl plugin, the information put
in field 773 is very basic, incomplete, sometimes buggy ($9, $0).

Test plan
=========
1. Configure a MARC bibliographic framework: enable essential
   subfields in 773: 7, a, t, b, d, g, k, x, z, w (check the Editor
   checkbox), put them in this order, and chose plugin
   marc21_linking_section.pl for 773 $t.
2. Start creating a new record and go to 773 $t. Activate the plugin
   to find the a record to become the host record (perform a search
   for 'Linux kernel development'). Note the content of the 773
   field.
3. Apply the patch, restart plack etc.
4. Repeat p. 2.-3. See that the generated 773 field contains now much
   more information, including 773 $7.

Additionally, commented code has been removed and check/variable
initialization added to get rid of warnings in log.

Signed-off-by: Roman Dolny <roman.dolny@jezuici.pl>
Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
This commit is contained in:
Janusz Kaczmarek 2025-02-02 15:17:35 +01:00 committed by Lucas Gass
parent 38b0e7ce61
commit 4fedfc5adb
No known key found for this signature in database
GPG Key ID: 60B447398B0D36CA
2 changed files with 126 additions and 67 deletions

View File

@ -56,7 +56,7 @@ my $launcher = sub {
my ($params) = @_;
my $query = $params->{cgi};
my $dbh = C4::Context->dbh;
my $op = $query->param('op');
my $op = $query->param('op') // '';
# -- op could be equal to
# * fillinput
@ -87,55 +87,121 @@ my $launcher = sub {
my $biblio = Koha::Biblios->find($biblionumber);
$marcrecord = $biblio->metadata->record;
my $subfield_value_9 = $biblionumber;
my $subfield_value_0 = $biblionumber;
#my $subfield_value_0;
#$subfield_value_0 = $marcrecord->field('001')->data
# if $marcrecord->field('001');
my $subfield_value_w;
my $subfield_value_w = '';
my $subfield_value_7 = '';
my $subfield_value_9 = '';
my $subfield_value_0 = '';
my $subfield_value_a = '';
my $subfield_value_b = '';
my $subfield_value_c = '';
my $subfield_value_d = '';
my $subfield_value_e = '';
my $subfield_value_h = '';
my $subfield_value_i = '';
my $subfield_value_k = '';
my $subfield_value_p = '';
my $subfield_value_t = '';
my $subfield_value_u = '';
my $subfield_value_v = '';
my $subfield_value_x = '';
my $subfield_value_y = '';
my $subfield_value_z = '';
my $main_entry;
if ( $marcrecord->field('1..') ) {
$main_entry = $marcrecord->field('1..')->clone;
if ( $main_entry->tag eq '111' ) {
$main_entry->delete_subfield( code => qr/[94j]/ );
} else {
$main_entry->delete_subfield( code => qr/[94e]/ );
}
}
my $s7 = "nn" . substr( $marcrecord->leader, 6, 2 );
if ($main_entry) {
my $c1 = 'n';
if ( $main_entry->tag =~ /^1[01]/ ) {
$c1 = $main_entry->indicator('1')
if $main_entry->tag =~ /^1[01]/;
$c1 = $main_entry->tag eq '100' ? 1 : 2 unless $c1 =~ /\d/;
}
my $c0 =
( $main_entry->tag eq '100' ) ? 'p'
: (
$main_entry->tag eq '110' ? 'c'
: ( $main_entry->tag eq '111' ? 'm' : 'u' )
);
substr( $s7, 0, 2, $c0 . $c1 );
}
$subfield_value_7 = $s7;
if ($main_entry) {
my $a = $main_entry->as_string;
$a =~ s/\.$// unless $a =~ /\b[a-z]{1,2}\.$/i;
$subfield_value_a = $a;
}
my $f245c = $marcrecord->field('245')->clone;
$f245c->delete_subfield( code => 'c' );
my $t = $f245c->as_string;
$t =~ s/(\s*\/\s*|\.)$//;
$t = ucfirst substr( $t, $f245c->indicator('2') );
$subfield_value_t = $t;
if ( $marcrecord->field('250') ) {
my $b = $marcrecord->field('250')->as_string;
$b =~ s/\.$//;
$subfield_value_b = $b;
}
if ( $marcrecord->field('260') ) {
my $d = $marcrecord->field('260')->as_string('abc');
$d =~ s/\.$//;
$subfield_value_d = $d;
}
for my $f ( $marcrecord->field('8[013][01]') ) {
my $k = $f->as_string('abcdnjltnp');
if ( $f->subfield('x') ) {
$k .= ', ISSN ' . $f->subfield('x');
}
if ( $f->subfield('v') ) {
$k .= ' ; ' . $f->subfield('v');
}
$subfield_value_k .= $subfield_value_k ? ". $k" : $k;
}
for my $f ( $marcrecord->field('022') ) {
$subfield_value_x = $f->subfield('a') if $f->subfield('a');
}
for my $f ( $marcrecord->field('020') ) {
$subfield_value_z = $f->subfield('a') if $f->subfield('a');
}
if ( $marcrecord->field('001') ) {
$subfield_value_w = $marcrecord->field('001')->data;
} else {
$subfield_value_w = $biblionumber;
my $w = $marcrecord->field('001')->data;
if ( $marcrecord->field('003') ) {
$w = '(' . $marcrecord->field('003')->data . ')' . $w;
}
$subfield_value_w = $w;
}
my $subfield_value_a;
my $subfield_value_c;
my $subfield_value_d;
my $subfield_value_e;
my $subfield_value_h;
my $subfield_value_i;
my $subfield_value_p;
my $subfield_value_t;
if ( $marcrecord->field('245') ) {
$subfield_value_t = $marcrecord->title();
}
my $subfield_value_u;
my $subfield_value_v;
my $subfield_value_x;
my $subfield_value_y;
my $subfield_value_z;
$subfield_value_x = $marcrecord->field('022')->subfield("a")
if ( $marcrecord->field('022') );
$subfield_value_z = $marcrecord->field('020')->subfield("a")
if ( $marcrecord->field('020') );
$subfield_value_w ||= $biblionumber;
# escape the 's
$subfield_value_7 =~ s/'/\\'/g;
$subfield_value_9 =~ s/'/\\'/g;
$subfield_value_0 =~ s/'/\\'/g;
$subfield_value_a =~ s/'/\\'/g;
$subfield_value_b =~ s/'/\\'/g;
$subfield_value_c =~ s/'/\\'/g;
$subfield_value_d =~ s/'/\\'/g;
$subfield_value_e =~ s/'/\\'/g;
$subfield_value_h =~ s/'/\\'/g;
$subfield_value_i =~ s/'/\\'/g;
$subfield_value_k =~ s/'/\\'/g;
$subfield_value_p =~ s/'/\\'/g;
$subfield_value_t =~ s/'/\\'/g;
$subfield_value_u =~ s/'/\\'/g;
@ -148,14 +214,17 @@ my $launcher = sub {
fillinput => 1,
index => scalar $query->param('index') . "",
biblionumber => $biblionumber ? $biblionumber : "",
subfield_value_7 => "$subfield_value_7",
subfield_value_9 => "$subfield_value_9",
subfield_value_0 => "$subfield_value_0",
subfield_value_a => "$subfield_value_a",
subfield_value_b => "$subfield_value_b",
subfield_value_c => "$subfield_value_c",
subfield_value_d => "$subfield_value_d",
subfield_value_e => "$subfield_value_e",
subfield_value_h => "$subfield_value_h",
subfield_value_i => "$subfield_value_i",
subfield_value_k => "$subfield_value_k",
subfield_value_p => "$subfield_value_p",
subfield_value_t => "$subfield_value_t",
subfield_value_u => "$subfield_value_u",
@ -169,7 +238,7 @@ my $launcher = sub {
} elsif ( $op eq "do_search" ) {
my $search = $query->param('search');
my $itype = $query->param('itype');
my $startfrom = $query->param('startfrom');
my $startfrom = $query->param('startfrom') || 0;
my $resultsperpage = $query->param('resultsperpage') || 20;
my $orderby;
my $op = 'AND';
@ -206,35 +275,28 @@ my $launcher = sub {
my @arrayresults;
my @field_data = ($search);
for ( my $i = 0 ; $i < $total && $i < $resultsperpage ; $i++ ) {
my $record = C4::Search::new_record_from_zebra( 'biblioserver', $results->[$i] );
my $rechash = TransformMarcToKoha( { record => $record } );
my $pos;
my $record = C4::Search::new_record_from_zebra( 'biblioserver', $results->[$i] );
my $rechash = TransformMarcToKoha( { record => $record } );
my $pos = 0;
my $countitems = $rechash->{itembumber} ? 1 : 0;
while ( index( $rechash->{itemnumber}, '|', $pos ) > 0 ) {
$countitems += 1;
$pos = index( $rechash->{itemnumber}, '|', $pos ) + 1;
if ( $rechash->{itembumber} ) {
while ( index( $rechash->{itemnumber}, '|', $pos ) > 0 ) {
$countitems += 1;
$pos = index( $rechash->{itemnumber}, '|', $pos ) + 1;
}
}
$rechash->{totitem} = $countitems;
my @holdingbranches = split /\|/, $rechash->{holdingbranch};
my @itemcallnumbers = split /\|/, $rechash->{itemcallnumber};
my $CN;
my @holdingbranches = split /\|/, $rechash->{holdingbranch} // '';
my @itemcallnumbers = split /\|/, $rechash->{itemcallnumber} // '';
my $CN = '';
for ( my $i = 0 ; $i < @holdingbranches ; $i++ ) {
$CN .= $holdingbranches[$i] . " ( " . $itemcallnumbers[$i] . " ) |";
$CN .= $holdingbranches[$i] . " ( " . ( $itemcallnumbers[$i] ? $itemcallnumbers[$i] : '' ) . " ) |";
}
$CN =~ s/ \|$//;
$rechash->{CN} = $CN;
push @arrayresults, $rechash;
}
# for(my $i = 0 ; $i <= $#marclist ; $i++)
# {
# push @field_data, { term => "marclist", val=>$marclist[$i] };
# push @field_data, { term => "and_or", val=>$and_or[$i] };
# push @field_data, { term => "excluding", val=>$excluding[$i] };
# push @field_data, { term => "operator", val=>$operator[$i] };
# push @field_data, { term => "value", val=>$value[$i] };
# }
my @numbers = ();
if ( $total_hits > $resultsperpage ) {
@ -262,18 +324,6 @@ my $launcher = sub {
$to = $from + $resultsperpage;
}
# my $link="/cgi-bin/koha/cataloguing/value_builder/unimarc4XX.pl?op=do_search&q=$search_desc&resultsperpage=$resultsperpage&startfrom=$startfrom&search=$search";
# foreach my $sort (@sort_by){
# $link.="&sort_by=".$sort."&";
# }
# $template->param(
# pagination_bar => pagination_bar(
# $link,
# getnbpages($hits, $results_per_page),
# $page,
# 'page'
# ),
# );
$template->param(
result => \@arrayresults,
index => scalar $query->param('index') . "",

View File

@ -184,6 +184,9 @@
var code = subfields[i];
var subfield = subfields[i + 1];
if (code.value == '7') {
subfield.value = "[% subfield_value_7 | html %]";
}
if (code.value == '9') {
subfield.value = "[% subfield_value_9 | html %]";
}
@ -193,6 +196,9 @@
if (code.value == 'a') {
subfield.value = "[% subfield_value_a | html %]";
}
if (code.value == 'b') {
subfield.value = "[% subfield_value_b | html %]";
}
if (code.value == 'c') {
subfield.value = "[% subfield_value_c | html %]";
}
@ -208,6 +214,9 @@
if (code.value == 'i') {
subfield.value = "[% subfield_value_i | html %]";
}
if (code.value == 'k') {
subfield.value = "[% subfield_value_k | html %]";
}
if (code.value == 'p') {
subfield.value = "[% subfield_value_p | html %]";
}