Lines 344-350
sub ModBiblio {
Link Here
|
344 |
|
344 |
|
345 |
=head2 _strip_item_fields |
345 |
=head2 _strip_item_fields |
346 |
|
346 |
|
347 |
_strip_item_fields($record, $frameworkcode) |
347 |
_strip_item_fields($record) |
348 |
|
348 |
|
349 |
Utility routine to remove item tags from a |
349 |
Utility routine to remove item tags from a |
350 |
MARC bib. |
350 |
MARC bib. |
Lines 355-361
sub _strip_item_fields {
Link Here
|
355 |
my $record = shift; |
355 |
my $record = shift; |
356 |
my $frameworkcode = shift; |
356 |
my $frameworkcode = shift; |
357 |
# get the items before and append them to the biblio before updating the record, atm we just have the biblio |
357 |
# get the items before and append them to the biblio before updating the record, atm we just have the biblio |
358 |
my ( $itemtag, $itemsubfield ) = GetMarcFromKohaField( "items.itemnumber", $frameworkcode ); |
358 |
my ( $itemtag, $itemsubfield ) = GetMarcFromKohaField( "items.itemnumber" ); |
359 |
|
359 |
|
360 |
# delete any item fields from incoming record to avoid |
360 |
# delete any item fields from incoming record to avoid |
361 |
# duplication or incorrect data - use AddItem() or ModItem() |
361 |
# duplication or incorrect data - use AddItem() or ModItem() |
Lines 1053-1066
sub GetMarcSubfieldStructure {
Link Here
|
1053 |
sub GetMarcFromKohaField { |
1053 |
sub GetMarcFromKohaField { |
1054 |
my ( $kohafield ) = @_; |
1054 |
my ( $kohafield ) = @_; |
1055 |
return unless $kohafield; |
1055 |
return unless $kohafield; |
1056 |
# The next call uses the Default framework since it is AUTHORITATIVE |
1056 |
|
1057 |
# for all Koha to MARC mappings. |
1057 |
my $cache = Koha::Caches->get_instance(); |
1058 |
my $mss = GetMarcSubfieldStructure( '' ); # Do not change framework |
1058 |
my $cache_key = "MarcFromKohaField-$kohafield"; |
1059 |
my @retval; |
1059 |
my $cached = $cache->get_from_cache($cache_key); |
1060 |
foreach( @{ $mss->{$kohafield} } ) { |
1060 |
if ( !defined $cached ) { |
1061 |
push @retval, $_->{tagfield}, $_->{tagsubfield}; |
1061 |
# The next call uses the Default framework since it is AUTHORITATIVE |
1062 |
} |
1062 |
# for all Koha to MARC mappings. |
1063 |
return wantarray ? @retval : ( @retval ? $retval[0] : undef ); |
1063 |
my $mss = GetMarcSubfieldStructure( '' ); # Do not change framework |
|
|
1064 |
my @retval; |
1065 |
foreach( @{ $mss->{$kohafield} } ) { |
1066 |
push @retval, $_->{tagfield}, $_->{tagsubfield}; |
1067 |
} |
1068 |
$cached = \@retval; |
1069 |
$cache->set_in_cache( $cache_key, $cached ); |
1070 |
} |
1071 |
return wantarray ? @$cached : ( @$cached ? $cached->[0] : undef ); |
1064 |
} |
1072 |
} |
1065 |
|
1073 |
|
1066 |
=head2 GetMarcSubfieldStructureFromKohaField |
1074 |
=head2 GetMarcSubfieldStructureFromKohaField |
Lines 1137-1146
sub GetMarcBiblio {
Link Here
|
1137 |
return; |
1145 |
return; |
1138 |
} |
1146 |
} |
1139 |
|
1147 |
|
1140 |
my $dbh = C4::Context->dbh; |
1148 |
# Use state to speed up repeated calls in batch processes |
1141 |
my $sth = $dbh->prepare("SELECT biblioitemnumber FROM biblioitems WHERE biblionumber=? "); |
1149 |
state $sth = C4::Context->dbh->prepare("SELECT biblioitemnumber FROM biblioitems WHERE biblionumber=? "); |
1142 |
$sth->execute($biblionumber); |
1150 |
$sth->execute($biblionumber); |
1143 |
my $row = $sth->fetchrow_hashref; |
1151 |
my $row = $sth->fetchrow_hashref; |
|
|
1152 |
$sth->finish; |
1144 |
my $biblioitemnumber = $row->{'biblioitemnumber'}; |
1153 |
my $biblioitemnumber = $row->{'biblioitemnumber'}; |
1145 |
my $marcxml = GetXmlBiblio( $biblionumber ); |
1154 |
my $marcxml = GetXmlBiblio( $biblionumber ); |
1146 |
$marcxml = StripNonXmlChars( $marcxml ); |
1155 |
$marcxml = StripNonXmlChars( $marcxml ); |
Lines 1179-1195
The XML should only contain biblio information (item information is no longer st
Link Here
|
1179 |
|
1188 |
|
1180 |
sub GetXmlBiblio { |
1189 |
sub GetXmlBiblio { |
1181 |
my ($biblionumber) = @_; |
1190 |
my ($biblionumber) = @_; |
1182 |
my $dbh = C4::Context->dbh; |
|
|
1183 |
return unless $biblionumber; |
1191 |
return unless $biblionumber; |
1184 |
my ($marcxml) = $dbh->selectrow_array( |
1192 |
|
|
|
1193 |
# Use state to speed up repeated calls in batch processes |
1194 |
state $sth = C4::Context->dbh->prepare( |
1185 |
q| |
1195 |
q| |
1186 |
SELECT metadata |
1196 |
SELECT metadata |
1187 |
FROM biblio_metadata |
1197 |
FROM biblio_metadata |
1188 |
WHERE biblionumber=? |
1198 |
WHERE biblionumber=? |
1189 |
AND format='marcxml' |
1199 |
AND format='marcxml' |
1190 |
AND marcflavour=? |
1200 |
AND marcflavour=? |
1191 |
|, undef, $biblionumber, C4::Context->preference('marcflavour') |
1201 |
| |
1192 |
); |
1202 |
); |
|
|
1203 |
|
1204 |
$sth->execute( $biblionumber, C4::Context->preference('marcflavour') ); |
1205 |
my ($marcxml) = $sth->fetchrow(); |
1206 |
$sth->finish; |
1193 |
return $marcxml; |
1207 |
return $marcxml; |
1194 |
} |
1208 |
} |
1195 |
|
1209 |
|
Lines 2090-2099
sub UpsertMarcControlField {
Link Here
|
2090 |
|
2104 |
|
2091 |
sub GetFrameworkCode { |
2105 |
sub GetFrameworkCode { |
2092 |
my ($biblionumber) = @_; |
2106 |
my ($biblionumber) = @_; |
2093 |
my $dbh = C4::Context->dbh; |
2107 |
# Use state to speed up repeated calls in batch processes |
2094 |
my $sth = $dbh->prepare("SELECT frameworkcode FROM biblio WHERE biblionumber=?"); |
2108 |
state $sth = C4::Context->dbh->prepare("SELECT frameworkcode FROM biblio WHERE biblionumber=?"); |
2095 |
$sth->execute($biblionumber); |
2109 |
$sth->execute($biblionumber); |
2096 |
my ($frameworkcode) = $sth->fetchrow; |
2110 |
my ($frameworkcode) = $sth->fetchrow; |
|
|
2111 |
$sth->finish; |
2097 |
return $frameworkcode; |
2112 |
return $frameworkcode; |
2098 |
} |
2113 |
} |
2099 |
|
2114 |
|
Lines 2756-2791
sub EmbedItemsInMarcBiblio {
Link Here
|
2756 |
|
2771 |
|
2757 |
$itemnumbers = [] unless defined $itemnumbers; |
2772 |
$itemnumbers = [] unless defined $itemnumbers; |
2758 |
|
2773 |
|
2759 |
my $frameworkcode = GetFrameworkCode($biblionumber); |
2774 |
_strip_item_fields($marc); |
2760 |
_strip_item_fields($marc, $frameworkcode); |
2775 |
|
|
|
2776 |
my $hidingrules = {}; |
2777 |
my $yaml = $opac ? C4::Context->preference('OpacHiddenItems') : ''; |
2778 |
if ( $yaml =~ /\S/ ) { |
2779 |
$yaml = "$yaml\n\n"; # YAML is anal on ending \n. Surplus does not hurt |
2780 |
eval { |
2781 |
$hidingrules = YAML::Load($yaml); |
2782 |
}; |
2783 |
if ($@) { |
2784 |
carp "Unable to parse OpacHiddenItems syspref : $@"; |
2785 |
} |
2786 |
} |
2761 |
|
2787 |
|
2762 |
# ... and embed the current items |
|
|
2763 |
my $dbh = C4::Context->dbh; |
2764 |
my $sth = $dbh->prepare("SELECT itemnumber FROM items WHERE biblionumber = ?"); |
2765 |
$sth->execute($biblionumber); |
2766 |
my @item_fields; |
2767 |
my ( $itemtag, $itemsubfield ) = GetMarcFromKohaField( "items.itemnumber", $frameworkcode ); |
2768 |
my @items; |
2769 |
my $opachiddenitems = $opac |
2770 |
&& ( C4::Context->preference('OpacHiddenItems') !~ /^\s*$/ ); |
2771 |
require C4::Items; |
2788 |
require C4::Items; |
2772 |
while ( my ($itemnumber) = $sth->fetchrow_array ) { |
2789 |
|
2773 |
next if @$itemnumbers and not grep { $_ == $itemnumber } @$itemnumbers; |
2790 |
my $item_fields = C4::Items::GetMarcItemFields( $biblionumber, $itemnumbers, $hidingrules ); |
2774 |
my $i = $opachiddenitems ? C4::Items::GetItem($itemnumber) : undef; |
2791 |
|
2775 |
push @items, { itemnumber => $itemnumber, item => $i }; |
2792 |
$marc->append_fields(@$item_fields) if ( @$item_fields ); |
2776 |
} |
|
|
2777 |
my @hiddenitems = |
2778 |
$opachiddenitems |
2779 |
? C4::Items::GetHiddenItemnumbers( map { $_->{item} } @items ) |
2780 |
: (); |
2781 |
# Convert to a hash for quick searching |
2782 |
my %hiddenitems = map { $_ => 1 } @hiddenitems; |
2783 |
foreach my $itemnumber ( map { $_->{itemnumber} } @items ) { |
2784 |
next if $hiddenitems{$itemnumber}; |
2785 |
my $item_marc = C4::Items::GetMarcItem( $biblionumber, $itemnumber ); |
2786 |
push @item_fields, $item_marc->field($itemtag); |
2787 |
} |
2788 |
$marc->append_fields(@item_fields); |
2789 |
} |
2793 |
} |
2790 |
|
2794 |
|
2791 |
=head1 INTERNAL FUNCTIONS |
2795 |
=head1 INTERNAL FUNCTIONS |