@EXPORT_OK = qw(
AddBiblio
GetBiblioData
- GetMarcBiblio
GetISBDView
GetMarcControlnumber
GetMarcISBN
CountItemsIssued
ModBiblio
ModZebra
- EmbedItemsInMarcBiblio
UpdateTotalIssues
RemoveAllNsb
DelBiblio
nsb_clean
SetMarcUnicodeFlag
SetUTF8Flag
- StripNonXmlChars
);
+use C4::Languages;
use C4::Linker;
use C4::OAI::Sets;
use C4::Items qw( GetMarcItem );
use Koha::Logger;
use Koha::Caches;
+use Koha::ClassSources;
use Koha::Authority::Types;
use Koha::Acquisition::Currencies;
use Koha::BackgroundJob::BatchUpdateBiblioHoldsQueue;
# update MARC subfield that stores biblioitems.cn_sort
_koha_marc_update_biblioitem_cn_sort( $record, $olddata, $frameworkcode );
- if (C4::Context->preference('BiblioAddsAuthorities')) {
+ if (C4::Context->preference('AutoLinkBiblios')) {
BiblioAutoLink( $record, $frameworkcode );
}
logaction( "CATALOGUING", "MODIFY", $biblionumber, "biblio BEFORE=>" . $biblio->metadata->record->as_formatted );
}
- if ( !$options->{disable_autolink} && C4::Context->preference('BiblioAddsAuthorities') ) {
+ if ( !$options->{disable_autolink} && C4::Context->preference('AutoLinkBiblios') ) {
BiblioAutoLink( $record, $frameworkcode );
}
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 GetAuthorisedValueDesc {
my ( $tag, $subfield, $value, $framework, $tagslib, $category, $opac ) = @_;
+ return q{} unless defined($value);
+
+ my $cache = Koha::Caches->get_instance();
+ my $cache_key;
if ( !$category ) {
return $value unless defined $tagslib->{$tag}->{$subfield}->{'authorised_value'};
#---- branch
if ( $tagslib->{$tag}->{$subfield}->{'authorised_value'} eq "branches" ) {
- my $branch = Koha::Libraries->find($value);
- return $branch? $branch->branchname: q{};
+ $cache_key = "LibraryNames";
+ my $libraries = $cache->get_from_cache( $cache_key, { unsafe => 1 } );
+ if ( !$libraries ) {
+ $libraries = {
+ map { $_->branchcode => $_->branchname }
+ Koha::Libraries->search( {},
+ { columns => [ 'branchcode', 'branchname' ] } )
+ ->as_list
+ };
+ $cache->set_in_cache($cache_key, $libraries);
+ }
+ return $libraries->{$value};
}
#---- itemtypes
if ( $tagslib->{$tag}->{$subfield}->{'authorised_value'} eq "itemtypes" ) {
- my $itemtype = Koha::ItemTypes->find( $value );
- return $itemtype ? $itemtype->translated_description : q||;
+ my $lang = C4::Languages::getlanguage;
+ $lang //= 'en';
+ $cache_key = $lang . 'ItemTypeDescriptions';
+ my $itypes = $cache->get_from_cache( $cache_key, { unsafe => 1 } );
+ if ( !$itypes ) {
+ $itypes =
+ { map { $_->itemtype => $_->translated_description }
+ Koha::ItemTypes->search()->as_list };
+ $cache->set_in_cache( $cache_key, $itypes );
+ }
+ return $itypes->{$value};
}
if ( $tagslib->{$tag}->{$subfield}->{'authorised_value'} eq "cn_source" ) {
- my $source = GetClassSource($value);
- return $source ? $source->{description} : q||;
+ $cache_key = "cn_sources:description";
+ my $cn_sources = $cache->get_from_cache( $cache_key, { unsafe => 1 } );
+ if ( !$cn_sources ) {
+ $cn_sources = {
+ map { $_->cn_source => $_->description }
+ Koha::ClassSources->search( {},
+ { columns => [ 'cn_source', 'description' ] } )
+ ->as_list
+ };
+ $cache->set_in_cache($cache_key, $cn_sources);
+ }
+ return $cn_sources->{$value};
}
#---- "true" authorized value
my $dbh = C4::Context->dbh;
if ( $category ne "" ) {
- my $sth = $dbh->prepare( "SELECT lib, lib_opac FROM authorised_values WHERE category = ? AND authorised_value = ?" );
- $sth->execute( $category, $value );
- my $data = $sth->fetchrow_hashref;
- return ( $opac && $data->{'lib_opac'} ) ? $data->{'lib_opac'} : $data->{'lib'};
+ $cache_key = "AVDescriptions-" . $category;
+ my $av_descriptions = $cache->get_from_cache( $cache_key, { unsafe => 1 } );
+ if ( !$av_descriptions ) {
+ $av_descriptions = {
+ map {
+ $_->authorised_value =>
+ { lib => $_->lib, lib_opac => $_->lib_opac }
+ } Koha::AuthorisedValues->search(
+ { category => $category },
+ {
+ columns => [ 'authorised_value', 'lib_opac', 'lib' ]
+ }
+ )->as_list
+ };
+ $cache->set_in_cache($cache_key, $av_descriptions);
+ }
+ return ( $opac && $av_descriptions->{$value}->{'lib_opac'} )
+ ? $av_descriptions->{$value}->{'lib_opac'}
+ : $av_descriptions->{$value}->{'lib'};
} else {
return $value; # if nothing is found return the original value
}
}
}
-=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 };
- }
- items => \@items2pass,
- borcat => $borcat })
- : ();
- # Convert to a hash for quick searching
- my %hiddenitems = map { $_ => 1 } @hiddenitems;
- my @itemnumbers = Koha::Items->search( { itemnumber => $itemnumbers } )
- ->filter_by_visible_in_opac({ patron => })->get_column('itemnumber');
- 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
} else {
C4::Biblio::UpsertMarcSubfield($record, $biblioitem_tag, $biblioitem_subfield, $biblioitemnumber);
}
+
+ # update the control number (001) in MARC
+ if(C4::Context->preference('autoControlNumber') eq 'biblionumber'){
+ unless($record->field('001')){
+ $record->insert_fields_ordered(MARC::Field->new('001', $biblionumber));
+ }
+ }
}
=head2 _koha_marc_update_biblioitem_cn_sort
my $biblio = Koha::Biblios->find($biblionumber);
unless ($biblio) {
- carp "UpdateTotalIssues could not get datas of biblio";
+ carp "UpdateTotalIssues could not get biblio";
return;
}