@EXPORT_OK = qw(
AddBiblio
GetBiblioData
- GetMarcBiblio
GetISBDView
GetMarcControlnumber
GetMarcISBN
TransformHtmlToMarc
TransformHtmlToXml
prepare_host_field
- TransformMarcToKohaOneField
);
# Internal functions
nsb_clean
SetMarcUnicodeFlag
SetUTF8Flag
- StripNonXmlChars
);
use C4::Linker;
use C4::OAI::Sets;
-use C4::Items qw( GetHiddenItemnumbers GetMarcItem );
+use C4::Items qw( GetMarcItem );
use Koha::Logger;
use Koha::Caches;
bib to add, while the second argument is the desired MARC
framework code.
-This function also accepts a third, optional argument: a hashref
-to additional options. The only defined option is C<defer_marc_save>,
-which if present and mapped to a true value, causes C<AddBiblio>
-to omit the call to save the MARC in C<biblio_metadata.metadata>
-This option is provided B<only>
-for the use of scripts such as C<bulkmarcimport.pl> that may need
-to do some manipulation of the MARC record for item parsing before
-saving it and which cannot afford the performance hit of saving
-the MARC record twice. Consequently, do not use that option
-unless you can guarantee that C<ModBiblioMarc> will be called.
+The C<$options> argument is a hashref with additional parameters:
+
+=over 4
+
+=item B<defer_marc_save>: used when ModBiblioMarc is handled by the caller
+
+=item B<skip_record_index>: used when the indexing schedulling will be handled by the caller
+
+=back
=cut
sub AddBiblio {
- my $record = shift;
- my $frameworkcode = shift;
- my $options = @_ ? shift : undef;
- my $defer_marc_save = 0;
+ my ( $record, $frameworkcode, $options ) = @_;
+
+ $options //= {};
+ my $skip_record_index = $options->{skip_record_index} || 0;
+ my $defer_marc_save = $options->{defer_marc_save} || 0;
+
if (!$record) {
carp('AddBiblio called with undefined record');
return;
}
- if ( defined $options and exists $options->{'defer_marc_save'} and $options->{'defer_marc_save'} ) {
- $defer_marc_save = 1;
- }
my $schema = Koha::Database->schema;
my ( $biblionumber, $biblioitemnumber );
}
# now add the record
- ModBiblioMarc( $record, $biblionumber ) unless $defer_marc_save;
+ ModBiblioMarc( $record, $biblionumber, { skip_record_index => $skip_record_index } ) unless $defer_marc_save;
# update OAI-PMH sets
if(C4::Context->preference("OAI-PMH:AutoUpdateSets")) {
}
if ( C4::Context->preference("CataloguingLog") ) {
- my $newrecord = GetMarcBiblio({ biblionumber => $biblionumber });
- logaction( "CATALOGUING", "MODIFY", $biblionumber, "biblio BEFORE=>" . $newrecord->as_formatted );
+ my $biblio = Koha::Biblios->find($biblionumber);
+ logaction( "CATALOGUING", "MODIFY", $biblionumber, "biblio BEFORE=>" . $biblio->metadata->record->as_formatted );
}
if ( !$options->{disable_autolink} && C4::Context->preference('BiblioAddsAuthorities') ) {
return wantarray ? @{$mss->{$kohafield}} : $mss->{$kohafield}->[0];
}
-=head2 GetMarcBiblio
-
- my $record = GetMarcBiblio({
- biblionumber => $biblionumber,
- embed_items => $embeditems,
- opac => $opac,
- borcat => $patron_category });
-
-Returns MARC::Record representing a biblio record, or C<undef> if the
-biblionumber doesn't exist.
-
-Both embed_items and opac are optional.
-If embed_items is passed and is 1, items are embedded.
-If opac is passed and is 1, the record is filtered as needed.
-
-=over 4
-
-=item C<$biblionumber>
-
-the biblionumber
-
-=item C<$embeditems>
-
-set to true to include item information.
-
-=item C<$opac>
-
-set to true to make the result suited for OPAC view. This causes things like
-OpacHiddenItems to be applied.
-
-=item C<$borcat>
-
-If the OpacHiddenItemsExceptions system preference is set, this patron category
-can be used to make visible OPAC items which would be normally hidden.
-It only makes sense in combination both embed_items and opac values true.
-
-=back
-
-=cut
-
-sub GetMarcBiblio {
- my ($params) = @_;
-
- if (not defined $params) {
- carp 'GetMarcBiblio called without parameters';
- return;
- }
-
- my $biblionumber = $params->{biblionumber};
- my $embeditems = $params->{embed_items} || 0;
- my $opac = $params->{opac} || 0;
- my $borcat = $params->{borcat} // q{};
-
- if (not defined $biblionumber) {
- carp 'GetMarcBiblio called with undefined biblionumber';
- return;
- }
-
- my $marcxml = GetXmlBiblio( $biblionumber );
- $marcxml = StripNonXmlChars( $marcxml );
- MARC::File::XML->default_record_format( C4::Context->preference('marcflavour') );
- my $record = MARC::Record->new();
-
- if ($marcxml) {
- $record = eval {
- MARC::Record::new_from_xml( $marcxml, "UTF-8",
- C4::Context->preference('marcflavour') );
- };
- if ($@) { warn " problem with :$biblionumber : $@ \n$marcxml"; }
- return unless $record;
-
- C4::Biblio::EmbedItemsInMarcBiblio({
- marc_record => $record,
- biblionumber => $biblionumber,
- opac => $opac,
- borcat => $borcat })
- if ($embeditems);
-
- return $record;
- }
- else {
- return;
- }
-}
-
=head2 GetXmlBiblio
my $marcxml = GetXmlBiblio($biblionumber);
sub PrepHostMarcField {
my ($hostbiblionumber,$hostitemnumber, $marcflavour) = @_;
$marcflavour ||="MARC21";
-
- my $hostrecord = GetMarcBiblio({ biblionumber => $hostbiblionumber });
+
+ my $biblio = Koha::Biblios->find($hostbiblionumber);
+ my $hostrecord = $biblio->metadata->record;
my $item = Koha::Items->find($hostitemnumber);
my $hostmarcfield;
my $record = $params->{record};
my $limit_table = $params->{limit_table} // q{};
+ my $kohafields = $params->{kohafields};
my $result = {};
if (!defined $record) {
# The next call acknowledges Default as the authoritative framework
# for Koha to MARC mappings.
my $mss = GetMarcSubfieldStructure( '', { unsafe => 1 } ); # Do not change framework
- foreach my $kohafield ( keys %{ $mss } ) {
+ @{$kohafields} = keys %{ $mss } unless $kohafields;
+ foreach my $kohafield ( @{$kohafields} ) {
my ( $table, $column ) = split /[.]/, $kohafield, 2;
next unless $tables{$table};
- my $val = TransformMarcToKohaOneField( $kohafield, $record );
- next if !defined $val;
+ my ( $value, @values );
+ foreach my $fldhash ( @{$mss->{$kohafield}} ) {
+ my $tag = $fldhash->{tagfield};
+ my $sub = $fldhash->{tagsubfield};
+ foreach my $fld ( $record->field($tag) ) {
+ if( $sub eq '@' || $fld->is_control_field ) {
+ push @values, $fld->data if $fld->data;
+ } else {
+ push @values, grep { $_ } $fld->subfield($sub);
+ }
+ }
+ }
+ if ( @values ){
+ $value = join ' | ', uniq(@values);
+
+ # Additional polishing for individual kohafields
+ if( $kohafield =~ /copyrightdate|publicationyear/ ) {
+ $value = _adjust_pubyear( $value );
+ }
+ }
+
+ next if !defined $value;
my $key = _disambiguate( $table, $column );
- $result->{$key} = $val;
+ $result->{$key} = $value;
}
return $result;
}
}
-=head2 TransformMarcToKohaOneField
-
- $val = TransformMarcToKohaOneField( 'biblio.title', $marc );
-
- Note: The authoritative Default framework is used implicitly.
-
-=cut
-
-sub TransformMarcToKohaOneField {
- my ( $kohafield, $marc ) = @_;
-
- my ( @rv, $retval );
- my @mss = GetMarcSubfieldStructureFromKohaField($kohafield);
- foreach my $fldhash ( @mss ) {
- my $tag = $fldhash->{tagfield};
- my $sub = $fldhash->{tagsubfield};
- foreach my $fld ( $marc->field($tag) ) {
- if( $sub eq '@' || $fld->is_control_field ) {
- push @rv, $fld->data if $fld->data;
- } else {
- push @rv, grep { $_ } $fld->subfield($sub);
- }
- }
- }
- return unless @rv;
- $retval = join ' | ', uniq(@rv);
-
- # Additional polishing for individual kohafields
- if( $kohafield =~ /copyrightdate|publicationyear/ ) {
- $retval = _adjust_pubyear( $retval );
- }
-
- return $retval;
-}
-
=head2 _adjust_pubyear
- Helper routine for TransformMarcToKohaOneField
+ Helper routine for TransformMarcToKoha
=cut
}
}
-=head2 EmbedItemsInMarcBiblio
-
- EmbedItemsInMarcBiblio({
- marc_record => $marc,
- biblionumber => $biblionumber,
- item_numbers => $itemnumbers,
- opac => $opac });
-
-Given a MARC::Record object containing a bib record,
-modify it to include the items attached to it as 9XX
-per the bib's MARC framework.
-if $itemnumbers is defined, only specified itemnumbers are embedded.
-
-If $opac is true, then opac-relevant suppressions are included.
-
-If opac filtering will be done, borcat should be passed to properly
-override if necessary.
-
-=cut
-
-sub EmbedItemsInMarcBiblio {
- my ($params) = @_;
- my ($marc, $biblionumber, $itemnumbers, $opac, $borcat);
- $marc = $params->{marc_record};
- if ( !$marc ) {
- carp 'EmbedItemsInMarcBiblio: No MARC record passed';
- return;
- }
- $biblionumber = $params->{biblionumber};
- $itemnumbers = $params->{item_numbers};
- $opac = $params->{opac};
- $borcat = $params->{borcat} // q{};
-
- $itemnumbers = [] unless defined $itemnumbers;
-
- my $frameworkcode = GetFrameworkCode($biblionumber);
- _strip_item_fields($marc, $frameworkcode);
-
- # ... and embed the current items
- my $dbh = C4::Context->dbh;
- my $sth = $dbh->prepare("SELECT itemnumber FROM items WHERE biblionumber = ?");
- $sth->execute($biblionumber);
- my ( $itemtag, $itemsubfield ) = GetMarcFromKohaField( "items.itemnumber" );
-
- my @item_fields; # Array holding the actual MARC data for items to be included.
- my @items; # Array holding items which are both in the list (sitenumbers)
- # and on this biblionumber
-
- # Flag indicating if there is potential hiding.
- my $opachiddenitems = $opac
- && ( C4::Context->preference('OpacHiddenItems') !~ /^\s*$/ );
-
- while ( my ($itemnumber) = $sth->fetchrow_array ) {
- next if @$itemnumbers and not grep { $_ == $itemnumber } @$itemnumbers;
- my $item;
- if ( $opachiddenitems ) {
- $item = Koha::Items->find($itemnumber);
- $item = $item ? $item->unblessed : undef;
- }
- push @items, { itemnumber => $itemnumber, item => $item };
- }
- my @items2pass = map { $_->{item} } @items;
- my @hiddenitems =
- $opachiddenitems
- ? C4::Items::GetHiddenItemnumbers({
- items => \@items2pass,
- borcat => $borcat })
- : ();
- # Convert to a hash for quick searching
- my %hiddenitems = map { $_ => 1 } @hiddenitems;
- foreach my $itemnumber ( map { $_->{itemnumber} } @items ) {
- next if $hiddenitems{$itemnumber};
- my $item_marc = C4::Items::GetMarcItem( $biblionumber, $itemnumber );
- push @item_fields, $item_marc->field($itemtag);
- }
- $marc->append_fields(@item_fields);
-}
-
=head1 INTERNAL FUNCTIONS
=head2 _koha_marc_update_bib_ids
sub prepare_host_field {
my ( $hostbiblio, $marcflavour ) = @_;
$marcflavour ||= C4::Context->preference('marcflavour');
- my $host = GetMarcBiblio({ biblionumber => $hostbiblio });
+
+ my $biblio = Koha::Biblios->find($hostbiblio);
+ my $host = $biblio->metadata->record;
# unfortunately as_string does not 'do the right thing'
# if field returns undef
my %sfd;
my ($biblionumber, $increase, $value, $skip_holds_queue) = @_;
my $totalissues;
- my $record = GetMarcBiblio({ biblionumber => $biblionumber });
- unless ($record) {
- carp "UpdateTotalIssues could not get biblio record";
+ my $biblio = Koha::Biblios->find($biblionumber);
+ unless ($biblio) {
+ carp "UpdateTotalIssues could not get biblio";
return;
}
- my $biblio = Koha::Biblios->find( $biblionumber );
- unless ($biblio) {
- carp "UpdateTotalIssues could not get datas of biblio";
+
+ my $record = $biblio->metadata->record;
+ unless ($record) {
+ carp "UpdateTotalIssues could not get biblio record";
return;
}
my $biblioitem = $biblio->biblioitem;
carp 'ApplyMarcOverlayRules called on undefined record';
return;
}
- my $old_record = GetMarcBiblio({ biblionumber => $biblionumber });
+ my $biblio = Koha::Biblios->find($biblionumber);
+ my $old_record = $biblio->metadata->record;
# Skip overlay rules if called with no context
if ($old_record && defined $params->{overlay_context}) {