Lines 292-298
sub ModBiblio {
Link Here
|
292 |
|
292 |
|
293 |
$frameworkcode = "" if !$frameworkcode || $frameworkcode eq "Default"; # XXX |
293 |
$frameworkcode = "" if !$frameworkcode || $frameworkcode eq "Default"; # XXX |
294 |
|
294 |
|
295 |
_strip_item_fields($record, $frameworkcode); |
295 |
_strip_item_fields($record); |
296 |
|
296 |
|
297 |
# update biblionumber and biblioitemnumber in MARC |
297 |
# update biblionumber and biblioitemnumber in MARC |
298 |
# FIXME - this is assuming a 1 to 1 relationship between |
298 |
# FIXME - this is assuming a 1 to 1 relationship between |
Lines 326-332
sub ModBiblio {
Link Here
|
326 |
|
326 |
|
327 |
=head2 _strip_item_fields |
327 |
=head2 _strip_item_fields |
328 |
|
328 |
|
329 |
_strip_item_fields($record, $frameworkcode) |
329 |
_strip_item_fields($record) |
330 |
|
330 |
|
331 |
Utility routine to remove item tags from a |
331 |
Utility routine to remove item tags from a |
332 |
MARC bib. |
332 |
MARC bib. |
Lines 335-343
MARC bib.
Link Here
|
335 |
|
335 |
|
336 |
sub _strip_item_fields { |
336 |
sub _strip_item_fields { |
337 |
my $record = shift; |
337 |
my $record = shift; |
338 |
my $frameworkcode = shift; |
|
|
339 |
# get the items before and append them to the biblio before updating the record, atm we just have the biblio |
338 |
# get the items before and append them to the biblio before updating the record, atm we just have the biblio |
340 |
my ( $itemtag, $itemsubfield ) = GetMarcFromKohaField( "items.itemnumber", $frameworkcode ); |
339 |
my ( $itemtag, $itemsubfield ) = GetMarcFromKohaField( "items.itemnumber" ); |
341 |
|
340 |
|
342 |
# delete any item fields from incoming record to avoid |
341 |
# delete any item fields from incoming record to avoid |
343 |
# duplication or incorrect data - use AddItem() or ModItem() |
342 |
# duplication or incorrect data - use AddItem() or ModItem() |
Lines 1077-1090
sub GetMarcSubfieldStructure {
Link Here
|
1077 |
sub GetMarcFromKohaField { |
1076 |
sub GetMarcFromKohaField { |
1078 |
my ( $kohafield ) = @_; |
1077 |
my ( $kohafield ) = @_; |
1079 |
return unless $kohafield; |
1078 |
return unless $kohafield; |
1080 |
# The next call uses the Default framework since it is AUTHORITATIVE |
1079 |
|
1081 |
# for all Koha to MARC mappings. |
1080 |
my $cache = Koha::Caches->get_instance(); |
1082 |
my $mss = GetMarcSubfieldStructure( '', { unsafe => 1 } ); # Do not change framework |
1081 |
my $cache_key = "MarcFromKohaField-$kohafield"; |
1083 |
my @retval; |
1082 |
my $cached = $cache->get_from_cache($cache_key); |
1084 |
foreach( @{ $mss->{$kohafield} } ) { |
1083 |
if ( !defined $cached ) { |
1085 |
push @retval, $_->{tagfield}, $_->{tagsubfield}; |
1084 |
# The next call uses the Default framework since it is AUTHORITATIVE |
1086 |
} |
1085 |
# for all Koha to MARC mappings. |
1087 |
return wantarray ? @retval : ( @retval ? $retval[0] : undef ); |
1086 |
my $mss = GetMarcSubfieldStructure( '', { unsafe => 1 } ); # Do not change framework |
|
|
1087 |
my @retval; |
1088 |
foreach( @{ $mss->{$kohafield} } ) { |
1089 |
push @retval, $_->{tagfield}, $_->{tagsubfield}; |
1090 |
} |
1091 |
$cached = \@retval; |
1092 |
$cache->set_in_cache( $cache_key, $cached ); |
1093 |
} |
1094 |
return wantarray ? @$cached : ( @$cached ? $cached->[0] : undef ); |
1088 |
} |
1095 |
} |
1089 |
|
1096 |
|
1090 |
=head2 GetMarcSubfieldStructureFromKohaField |
1097 |
=head2 GetMarcSubfieldStructureFromKohaField |
Lines 2793-2799
override if necessary.
Link Here
|
2793 |
|
2800 |
|
2794 |
sub EmbedItemsInMarcBiblio { |
2801 |
sub EmbedItemsInMarcBiblio { |
2795 |
my ($params) = @_; |
2802 |
my ($params) = @_; |
2796 |
my ($marc, $biblionumber, $itemnumbers, $opac, $borcat); |
2803 |
my ($marc, $biblionumber, $itemnumbers, $use_hidingrules, $borcat); |
2797 |
$marc = $params->{marc_record}; |
2804 |
$marc = $params->{marc_record}; |
2798 |
if ( !$marc ) { |
2805 |
if ( !$marc ) { |
2799 |
carp 'EmbedItemsInMarcBiblio: No MARC record passed'; |
2806 |
carp 'EmbedItemsInMarcBiblio: No MARC record passed'; |
Lines 2801-2849
sub EmbedItemsInMarcBiblio {
Link Here
|
2801 |
} |
2808 |
} |
2802 |
$biblionumber = $params->{biblionumber}; |
2809 |
$biblionumber = $params->{biblionumber}; |
2803 |
$itemnumbers = $params->{item_numbers}; |
2810 |
$itemnumbers = $params->{item_numbers}; |
2804 |
$opac = $params->{opac}; |
2811 |
$use_hidingrules = $params->{opac}; |
2805 |
$borcat = $params->{borcat} // q{}; |
2812 |
$borcat = $params->{borcat} // q{}; |
2806 |
|
2813 |
|
2807 |
$itemnumbers = [] unless defined $itemnumbers; |
2814 |
$itemnumbers = [] unless defined $itemnumbers; |
2808 |
|
2815 |
|
2809 |
my $frameworkcode = GetFrameworkCode($biblionumber); |
2816 |
_strip_item_fields($marc); |
2810 |
_strip_item_fields($marc, $frameworkcode); |
|
|
2811 |
|
2817 |
|
2812 |
# ... and embed the current items |
2818 |
my $hidingrules = {}; |
2813 |
my $dbh = C4::Context->dbh; |
2819 |
if ($use_hidingrules && $borcat && !UseHidingRulesWithBorrowerCategory($borcat)) { |
2814 |
my $sth = $dbh->prepare("SELECT itemnumber FROM items WHERE biblionumber = ?"); |
2820 |
# don't hide anything from this borrower category |
2815 |
$sth->execute($biblionumber); |
2821 |
$use_hidingrules = 0; |
2816 |
my ( $itemtag, $itemsubfield ) = GetMarcFromKohaField( "items.itemnumber", $frameworkcode ); |
2822 |
} |
2817 |
|
2823 |
|
2818 |
my @item_fields; # Array holding the actual MARC data for items to be included. |
2824 |
my $yaml = $use_hidingrules ? C4::Context->preference('OpacHiddenItems') : ''; |
2819 |
my @items; # Array holding items which are both in the list (sitenumbers) |
2825 |
if ( $yaml =~ /\S/ ) { |
2820 |
# and on this biblionumber |
2826 |
$yaml = "$yaml\n\n"; # YAML is anal on ending \n. Surplus does not hurt |
|
|
2827 |
eval { |
2828 |
$hidingrules = YAML::Load($yaml); |
2829 |
}; |
2830 |
if ($@) { |
2831 |
carp "Unable to parse OpacHiddenItems syspref : $@"; |
2832 |
} |
2833 |
} |
2821 |
|
2834 |
|
2822 |
# Flag indicating if there is potential hiding. |
2835 |
my $item_fields = C4::Items::GetMarcItemFields( $biblionumber, $itemnumbers, $hidingrules ); |
2823 |
my $opachiddenitems = $opac |
|
|
2824 |
&& ( C4::Context->preference('OpacHiddenItems') !~ /^\s*$/ ); |
2825 |
|
2836 |
|
2826 |
require C4::Items; |
2837 |
$marc->append_fields(@$item_fields) if ( @$item_fields ); |
2827 |
while ( my ($itemnumber) = $sth->fetchrow_array ) { |
|
|
2828 |
next if @$itemnumbers and not grep { $_ == $itemnumber } @$itemnumbers; |
2829 |
my $i = $opachiddenitems ? C4::Items::GetItem($itemnumber) : undef; |
2830 |
push @items, { itemnumber => $itemnumber, item => $i }; |
2831 |
} |
2832 |
my @items2pass = map { $_->{item} } @items; |
2833 |
my @hiddenitems = |
2834 |
$opachiddenitems |
2835 |
? C4::Items::GetHiddenItemnumbers({ |
2836 |
items => \@items2pass, |
2837 |
borcat => $borcat }) |
2838 |
: (); |
2839 |
# Convert to a hash for quick searching |
2840 |
my %hiddenitems = map { $_ => 1 } @hiddenitems; |
2841 |
foreach my $itemnumber ( map { $_->{itemnumber} } @items ) { |
2842 |
next if $hiddenitems{$itemnumber}; |
2843 |
my $item_marc = C4::Items::GetMarcItem( $biblionumber, $itemnumber ); |
2844 |
push @item_fields, $item_marc->field($itemtag); |
2845 |
} |
2846 |
$marc->append_fields(@item_fields); |
2847 |
} |
2838 |
} |
2848 |
|
2839 |
|
2849 |
=head1 INTERNAL FUNCTIONS |
2840 |
=head1 INTERNAL FUNCTIONS |