Bugzilla – Attachment 11554 Details for
Bug 8071
link beween bib and authorities with the authid
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
[patch]
Bug 8071: link between bib and authorities with the authid
Bug-8071-link-between-bib-and-authorities-with-the.patch (text/plain), 17.08 KB, created by
Jared Camins-Esakov
on 2012-08-11 17:01:07 UTC
(
hide
)
Description:
Bug 8071: link between bib and authorities with the authid
Filename:
MIME Type:
Creator:
Jared Camins-Esakov
Created:
2012-08-11 17:01:07 UTC
Size:
17.08 KB
patch
obsolete
>From 1dfa36332950db3ce4afea4ef89da1ec7c90e441 Mon Sep 17 00:00:00 2001 >From: Fridolyn SOMERS <fridolyn.somers@biblibre.com> >Date: Wed, 25 Jul 2012 17:59:54 +0200 >Subject: [PATCH] Bug 8071: link between bib and authorities with the authid >Content-Type: text/plain; charset="UTF-8" > >Do not automatically populate $9 in bibliographic headings when the >$9 is set in the authorized heading field of the authority record. > >Signed-off-by: Jared Camins-Esakov <jcamins@cpbibliography.com> >--- > C4/AuthoritiesMarc.pm | 3 +- > C4/Biblio.pm | 203 ++++++++++---------- > authorities/blinddetail-biblio-search.pl | 1 + > .../authorities/blinddetail-biblio-search.tt | 39 ++-- > 4 files changed, 123 insertions(+), 123 deletions(-) > >diff --git a/C4/AuthoritiesMarc.pm b/C4/AuthoritiesMarc.pm >index 21ebd94..d3d6e46 100644 >--- a/C4/AuthoritiesMarc.pm >+++ b/C4/AuthoritiesMarc.pm >@@ -1387,12 +1387,13 @@ sub merge { > foreach my $tagfield (@tags_using_authtype){ > # warn "tagfield : $tagfield "; > foreach my $field ($marcrecord->field($tagfield)){ >+ # biblio is linked to authority with $9 subfield containing authid > my $auth_number=$field->subfield("9"); > my $tag=$field->tag(); > if ($auth_number==$mergefrom) { > my $field_to=MARC::Field->new(($tag_to?$tag_to:$tag),$field->indicator(1),$field->indicator(2),"9"=>$mergeto); > my $exclude='9'; >- foreach my $subfield (@record_to) { >+ foreach my $subfield (grep {$_->[0] ne '9'} @record_to) { > $field_to->add_subfields($subfield->[0] =>$subfield->[1]); > $exclude.= $subfield->[0]; > } >diff --git a/C4/Biblio.pm b/C4/Biblio.pm >index c479502..56910ba 100644 >--- a/C4/Biblio.pm >+++ b/C4/Biblio.pm >@@ -1682,62 +1682,67 @@ The subjects are stored in different fields depending on MARC flavour > > sub GetMarcSubjects { > my ( $record, $marcflavour ) = @_; >- my ( $mintag, $maxtag ); >+ my ( $mintag, $maxtag, $fields_filter ); > if ( $marcflavour eq "UNIMARC" ) { > $mintag = "600"; > $maxtag = "611"; >- } else { # assume marc21 if not unimarc >+ $fields_filter = '6..'; >+ } else { # marc21/normarc > $mintag = "600"; > $maxtag = "699"; >+ $fields_filter = '6..'; > } > > my @marcsubjects; >- my $subject = ""; >- my $subfield = ""; >- my $marcsubject; > > my $subject_limit = C4::Context->preference("TraceCompleteSubfields") ? 'su,complete-subfield' : 'su'; >+ my $authoritysep = C4::Context->preference('authoritysep'); > >- foreach my $field ( $record->field('6..') ) { >- next unless $field->tag() >= $mintag && $field->tag() <= $maxtag; >+ foreach my $field ( $record->field($fields_filter) ) { >+ next unless ($field->tag() >= $mintag && $field->tag() <= $maxtag); > my @subfields_loop; > my @subfields = $field->subfields(); >- my $counter = 0; > my @link_loop; > >- # if there is an authority link, build the link with an= subfield9 >- my $found9 = 0; >+ # if there is an authority link, build the links with an= subfield9 >+ my $subfield9 = $field->subfield('9'); >+ if ($subfield9) { >+ my $linkvalue = $subfield9; >+ $linkvalue =~ s/(\(|\))//g; >+ @link_loop = ( { limit => 'an', 'link' => $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; >- my $operator; >- if ( $counter != 0 ) { >- $operator = ' and '; >- } >- if ( $code eq 9 ) { >- $found9 = 1; >- @link_loop = ( { 'limit' => 'an', link => "$linkvalue" } ); >- } >- if ( not $found9 ) { >- push @link_loop, { 'limit' => $subject_limit, link => $linkvalue, operator => $operator }; >- } >- my $separator; >- if ( $counter != 0 ) { >- $separator = C4::Context->preference('authoritysep'); >+ # if no authority link, build a search query >+ unless ($subfield9) { >+ push @link_loop, { >+ limit => $subject_limit, >+ 'link' => $linkvalue, >+ operator => (scalar @link_loop) ? ' and ' : undef >+ }; > } >- >- # ignore $9 > my @this_link_loop = @link_loop; >- push @subfields_loop, { code => $code, value => $value, link_loop => \@this_link_loop, separator => $separator } unless ( $subject_subfield->[0] eq 9 || $subject_subfield->[0] eq '0' ); >- $counter++; >+ # do not display $0 >+ unless ( $code eq '0' ) { >+ push @subfields_loop, { >+ code => $code, >+ value => $value, >+ link_loop => \@this_link_loop, >+ separator => (scalar @subfields_loop) ? $authoritysep : '' >+ }; >+ } > } > > push @marcsubjects, { MARCSUBJECT_SUBFIELDS_LOOP => \@subfields_loop }; >@@ -1757,7 +1762,7 @@ The authors are stored in different fields depending on MARC flavour > > sub GetMarcAuthors { > my ( $record, $marcflavour ) = @_; >- my ( $mintag, $maxtag ); >+ my ( $mintag, $maxtag, $fields_filter ); > > # tagslib useful for UNIMARC author reponsabilities > my $tagslib = >@@ -1765,15 +1770,17 @@ sub GetMarcAuthors { > if ( $marcflavour eq "UNIMARC" ) { > $mintag = "700"; > $maxtag = "712"; >- } elsif ( $marcflavour eq "MARC21" || $marcflavour eq "NORMARC" ) { # assume marc21 or normarc if not unimarc >+ $fields_filter = '7..'; >+ } else { # marc21/normarc > $mintag = "700"; > $maxtag = "720"; >- } else { >- return; >+ $fields_filter = '7..'; > } >+ > my @marcauthors; >+ my $authoritysep = C4::Context->preference('authoritysep'); > >- foreach my $field ( $record->fields ) { >+ foreach my $field ( $record->field($fields_filter) ) { > next unless $field->tag() >= $mintag && $field->tag() <= $maxtag; > my @subfields_loop; > my @link_loop; >@@ -1782,46 +1789,47 @@ sub GetMarcAuthors { > > # 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 > for my $authors_subfield (@subfields) { >+ next if ( $authors_subfield->[0] eq '9' ); > > # don't load unimarc subfields 3, 5 > next if ( $marcflavour eq 'UNIMARC' and ( $authors_subfield->[0] =~ /3|5/ ) ); >- my $subfieldcode = $authors_subfield->[0]; >+ >+ my $code = $authors_subfield->[0]; > my $value = $authors_subfield->[1]; > my $linkvalue = $value; > $linkvalue =~ s/(\(|\))//g; >- my $operator; >- if ( $count_auth != 0 ) { >- $operator = ' and '; >- } >- >- # if we have an authority link, use that as the link, otherwise use standard searching >- if ($subfield9) { >- @link_loop = ( { 'limit' => 'an', link => "$subfield9" } ); >- } else { >- >- # reset $linkvalue if UNIMARC author responsibility >- if ( $marcflavour eq 'UNIMARC' and ( $authors_subfield->[0] eq "4" ) ) { >- $linkvalue = "(" . GetAuthorisedValueDesc( $field->tag(), $authors_subfield->[0], $authors_subfield->[1], '', $tagslib ) . ")"; >- } >- push @link_loop, { 'limit' => 'au', link => $linkvalue, operator => $operator }; >+ # 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 >+ }; > } >- $value = GetAuthorisedValueDesc( $field->tag(), $authors_subfield->[0], $authors_subfield->[1], '', $tagslib ) >- if ( $marcflavour eq 'UNIMARC' and ( $authors_subfield->[0] =~ /4/ ) ); > my @this_link_loop = @link_loop; >- my $separator; >- if ( $count_auth != 0 ) { >- $separator = C4::Context->preference('authoritysep'); >+ # 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) ? $authoritysep : '' >+ }; > } >- push @subfields_loop, >- { tag => $field->tag(), >- code => $subfieldcode, >- value => $value, >- link_loop => \@this_link_loop, >- separator => $separator >- } >- unless ( $authors_subfield->[0] eq '9' || $authors_subfield->[0] eq '0'); >- $count_auth++; > } > push @marcauthors, { MARCAUTHOR_SUBFIELDS_LOOP => \@subfields_loop }; > } >@@ -1894,76 +1902,63 @@ The series are stored in different fields depending on MARC flavour > > sub GetMarcSeries { > my ( $record, $marcflavour ) = @_; >- my ( $mintag, $maxtag ); >+ my ( $mintag, $maxtag, $fields_filter ); > if ( $marcflavour eq "UNIMARC" ) { > $mintag = "600"; > $maxtag = "619"; >- } else { # assume marc21 if not unimarc >+ $fields_filter = '6..'; >+ } else { # marc21/normarc > $mintag = "440"; > $maxtag = "490"; >+ $fields_filter = '4..'; > } > > my @marcseries; >- my $subjct = ""; >- my $subfield = ""; >- my $marcsubjct; >+ my $authoritysep = C4::Context->preference('authoritysep'); > >- foreach my $field ( $record->field('440'), $record->field('490') ) { >+ foreach my $field ( $record->field($fields_filter) ) { >+ next unless $field->tag() >= $mintag && $field->tag() <= $maxtag; > my @subfields_loop; >- >- #my $value = $field->subfield('a'); >- #$marcsubjct = {MARCSUBJCT => $value,}; > my @subfields = $field->subfields(); >- >- #warn "subfields:".join " ", @$subfields; >- my $counter = 0; > my @link_loop; >+ > for my $series_subfield (@subfields) { >- my $volume_number; >- undef $volume_number; > >- # see if this is an instance of a volume >- if ( $series_subfield->[0] eq 'v' ) { >- $volume_number = 1; >- } >+ # ignore $9, used for authority link >+ next if ( $series_subfield->[0] eq '9' ); > >+ my $volume_number; > my $code = $series_subfield->[0]; > my $value = $series_subfield->[1]; > my $linkvalue = $value; > $linkvalue =~ s/(\(|\))//g; >- if ( $counter != 0 ) { >- push @link_loop, { link => $linkvalue, operator => ' and ', }; >- } else { >- push @link_loop, { link => $linkvalue, operator => undef, }; >- } >- my $separator; >- if ( $counter != 0 ) { >- $separator = C4::Context->preference('authoritysep'); >+ >+ # see if this is an instance of a volume >+ if ( $code eq 'v' ) { >+ $volume_number = 1; > } >+ >+ push @link_loop, { >+ 'link' => $linkvalue, >+ operator => (scalar @link_loop) ? ' and ' : undef >+ }; >+ > if ($volume_number) { > push @subfields_loop, { volumenum => $value }; > } else { >- if ( $series_subfield->[0] ne '9' ) { >- push @subfields_loop, { >- code => $code, >- value => $value, >- link_loop => \@link_loop, >- separator => $separator, >- volumenum => $volume_number, >- }; >+ push @subfields_loop, { >+ code => $code, >+ value => $value, >+ link_loop => \@link_loop, >+ separator => (scalar @subfields_loop) ? $authoritysep : '', >+ volumenum => $volume_number, > } > } >- $counter++; > } > push @marcseries, { MARCSERIES_SUBFIELDS_LOOP => \@subfields_loop }; > >- #$marcsubjct = {MARCSUBJCT => $field->as_string(),}; >- #push @marcsubjcts, $marcsubjct; >- #$subjct = $value; >- > } >- my $marcseriessarray = \@marcseries; >- return $marcseriessarray; >+ return \@marcseries; > } #end getMARCseriess > > =head2 GetMarcHosts >diff --git a/authorities/blinddetail-biblio-search.pl b/authorities/blinddetail-biblio-search.pl >index 7de7db3..0a091de 100755 >--- a/authorities/blinddetail-biblio-search.pl >+++ b/authorities/blinddetail-biblio-search.pl >@@ -84,6 +84,7 @@ if ($authid) { > # Get all values for each distinct subfield > my %subfields; > for ( $field->subfields ) { >+ next if $_->[0] == "9"; # $9 will be set with authid value > my $letter = $_->[0]; > next if defined $subfields{$letter}; > my @values = $field->subfield($letter); >diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/authorities/blinddetail-biblio-search.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/authorities/blinddetail-biblio-search.tt >index 56ed94f..87a132f 100644 >--- a/koha-tmpl/intranet-tmpl/prog/en/modules/authorities/blinddetail-biblio-search.tt >+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/authorities/blinddetail-biblio-search.tt >@@ -13,24 +13,6 @@ > } > > var field_start = whichfield.parentNode.parentNode; >- >- // browse all its subfields (clear and $9) >- var subfields = field_start.getElementsByTagName('input'); >- var re = /^tag_\d*_code_/; >- for(var i=0, len = subfields.length ; i< len ; i++) { // browse all subfields >- if(subfields[i].getAttribute('name').match(re)){ // it s a subfield >- var code = subfields[i]; // code is the first input >- var subfield = subfields[i+1]; // subfield the second >- >- [% IF ( clear ) %] >- if (subfield){subfield.value="" ;} >- [% ELSE %] >- if(code.value=='9'){ >- subfield.value = "[% authid |replace("'", "\'") |replace('"', '\"') |replace('\n', '\\n') |replace('\r', '\\r') %]"; >- } >- [% END %] >- } >- } > > // Sets the good number of form fields for the specified subfield > // Returns false if the cloning failed >@@ -90,6 +72,7 @@ > }); > } > >+ [% UNLESS ( clear ) %] > [% FOREACH SUBFIELD_LOO IN SUBFIELD_LOOP %] > SetSubfieldValues( > "[% tag_number |replace("'", "\'") |replace('"', '\"') |replace('\n', '\\n') |replace('\r', '\\r') %][% SUBFIELD_LOO.marc_subfield |replace("'", "\'") |replace('"', '\"') |replace('\n', '\\n') |replace('\r', '\\r') %]" >@@ -98,6 +81,26 @@ > [% END %] > ); > [% END %] >+ [% END %] >+ >+ // browse all its subfields (clear and $9) >+ var subfields = field_start.getElementsByTagName('input'); >+ var re = /^tag_\d*_code_/; >+ for(var i=0, len = subfields.length ; i< len ; i++) { // browse all subfields >+ if(subfields[i].getAttribute('name').match(re)){ // it s a subfield >+ var code = subfields[i]; // code is the first input >+ var subfield = subfields[i+1]; // subfield the second >+ >+ [% IF ( clear ) %] >+ if (subfield){subfield.value="" ;} >+ [% ELSE %] >+ if(code.value=='9'){ >+ subfield.value = "[% authid |replace("'", "\'") |replace('"', '\"') |replace('\n', '\\n') |replace('\r', '\\r') %]"; >+ break; >+ } >+ [% END %] >+ } >+ } > > opener.close(); > window.close(); >-- >1.7.2.5
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
|
Splinter Review
Attachments on
bug 8071
:
9513
|
11134
|
11157
| 11554