@@ -, +, @@
---
C4/Biblio.pm | 49 +++++++++++++---------
C4/HoldsQueue.pm | 17 ++++----
C4/Overdues.pm | 4 ++
C4/Search.pm | 2 +-
C4/ShelfBrowser.pm | 7 +++-
Koha/Biblio.pm | 11 ++---
acqui/neworderbiblio.pl | 2 +-
basket/basket.pl | 4 +-
catalogue/detail.pl | 2 +-
catalogue/moredetail.pl | 2 +-
circ/branchoverdues.pl | 8 ++--
circ/pendingreserves.pl | 13 +++---
circ/reserveratios.pl | 9 ++--
circ/transferstoreceive.pl | 7 ++--
.../prog/en/includes/waiting_holds.inc | 2 +-
.../prog/en/modules/circ/pendingreserves.tt | 2 +-
.../prog/en/modules/circ/view_holdsqueue.tt | 6 ++-
opac/opac-basket.pl | 2 +-
opac/opac-detail.pl | 2 +-
opac/opac-readingrecord.pl | 3 +-
opac/opac-reserve.pl | 6 ++-
opac/opac-sendshelf.pl | 2 +-
opac/opac-shelves.pl | 2 +-
opac/opac-showreviews.pl | 6 ++-
opac/opac-tags.pl | 5 ++-
opac/opac-user.pl | 13 +++---
svc/checkouts | 14 ++++---
svc/holds | 17 ++++----
t/Biblio.t | 2 +-
t/Biblio2.t | 16 +++++++
tags/list.pl | 5 +--
tools/batch_delete_records.pl | 2 +-
virtualshelves/sendshelf.pl | 3 +-
virtualshelves/shelves.pl | 2 +-
34 files changed, 147 insertions(+), 102 deletions(-)
--- a/C4/Biblio.pm
+++ a/C4/Biblio.pm
@@ -68,6 +68,7 @@ BEGIN {
TransformHtmlToMarc
TransformHtmlToXml
prepare_host_field
+ SplitSubtitle
);
# Internal functions
@@ -633,39 +634,33 @@ sub _check_valid_auth_link {
=head2 GetRecordValue
- my $values = GetRecordValue($field, $record, $frameworkcode);
+ my $values = GetRecordValue($field, $record);
-Get MARC fields from a keyword defined in fieldmapping table.
+Get MARC fields from the record using the framework mappings for biblio fields.
=cut
sub GetRecordValue {
- my ( $field, $record, $frameworkcode ) = @_;
+ my ( $field, $record ) = @_;
if (!$record) {
carp 'GetRecordValue called with undefined record';
return;
}
- my $dbh = C4::Context->dbh;
-
- my $sth = $dbh->prepare('SELECT fieldcode, subfieldcode FROM fieldmapping WHERE frameworkcode = ? AND field = ?');
- $sth->execute( $frameworkcode, $field );
-
- my @result = ();
-
- while ( my $row = $sth->fetchrow_hashref ) {
- foreach my $field ( $record->field( $row->{fieldcode} ) ) {
- if ( ( $row->{subfieldcode} ne "" && $field->subfield( $row->{subfieldcode} ) ) ) {
- foreach my $subfield ( $field->subfield( $row->{subfieldcode} ) ) {
- push @result, { 'subfield' => $subfield };
- }
- } elsif ( $row->{subfieldcode} eq "" ) {
- push @result, { 'subfield' => $field->as_string() };
+ my @result;
+ my @mss = GetMarcSubfieldStructureFromKohaField("biblio.$field");
+ foreach my $fldhash ( @mss ) {
+ my $tag = $fldhash->{tagfield};
+ my $sub = $fldhash->{tagsubfield};
+ foreach my $fld ( $record->field($tag) ) {
+ if( $sub eq '@' || $fld->is_control_field ) {
+ push @result, $fld->data if $fld->data;
+ } else {
+ push @result, grep { $_ } $fld->subfield($sub);
}
}
}
-
return \@result;
}
@@ -3609,6 +3604,22 @@ sub RemoveAllNsb {
return $record;
}
+=head2 SplitSubtitle
+
+ $subtitles = SplitSubtitle($subtitle);
+
+Splits a subtitle field to an array of hashes like the one GetRecordValue returns
+
+=cut
+
+sub SplitSubtitle {
+ my $subtitle = shift;
+
+ my @subtitles = map( { 'subfield' => $_ }, split(/ \| /, $subtitle // '' ) );
+
+ return \@subtitles;
+}
+
1;
--- a/C4/HoldsQueue.pm
+++ a/C4/HoldsQueue.pm
@@ -131,7 +131,12 @@ sub GetHoldsQueueItems {
my $dbh = C4::Context->dbh;
my @bind_params = ();
- my $query = q/SELECT tmp_holdsqueue.*, biblio.author, items.ccode, items.itype, biblioitems.itemtype, items.location, items.enumchron, items.cn_sort, biblioitems.publishercode,biblio.copyrightdate,biblioitems.publicationyear,biblioitems.pages,biblioitems.size,biblioitems.publicationyear,biblioitems.isbn,items.copynumber
+ my $query = q/SELECT tmp_holdsqueue.*, biblio.author, items.ccode, items.itype, biblioitems.itemtype, items.location,
+ items.enumchron, items.cn_sort, biblioitems.publishercode,
+ biblio.copyrightdate, biblio.subtitle, biblio.part_number,
+ biblio.part_name,
+ biblioitems.publicationyear, biblioitems.pages, biblioitems.size, biblioitems.publicationyear,
+ biblioitems.isbn, items.copynumber
FROM tmp_holdsqueue
JOIN biblio USING (biblionumber)
LEFT JOIN biblioitems USING (biblionumber)
@@ -146,19 +151,15 @@ sub GetHoldsQueueItems {
$sth->execute(@bind_params);
my $items = [];
while ( my $row = $sth->fetchrow_hashref ){
- my $record = GetMarcBiblio({ biblionumber => $row->{biblionumber} });
- if ($record){
- $row->{subtitle} = [ map { $_->{subfield} } @{ GetRecordValue( 'subtitle', $record, '' ) } ];
- $row->{parts} = GetRecordValue('parts',$record,'')->[0]->{subfield};
- $row->{numbers} = GetRecordValue('numbers',$record,'')->[0]->{subfield};
- }
-
# return the bib-level or item-level itype per syspref
if (!C4::Context->preference('item-level_itypes')) {
$row->{itype} = $row->{itemtype};
}
delete $row->{itemtype};
+ my @subtitles = split(/ \| /, $row->{'subtitle'} // '' );
+ $row->{'subtitle'} = \@subtitles;
+
push @$items, $row;
}
return $items;
--- a/C4/Overdues.pm
+++ a/C4/Overdues.pm
@@ -750,6 +750,10 @@ sub GetOverduesForBranch {
borrowers.phone,
borrowers.email,
biblio.title,
+ biblio.subtitle,
+ biblio.medium,
+ biblio.part_number,
+ biblio.part_name,
biblio.author,
biblio.biblionumber,
issues.date_due,
--- a/C4/Search.pm
+++ a/C4/Search.pm
@@ -1944,7 +1944,7 @@ sub searchResults {
SetUTF8Flag($marcrecord);
my $oldbiblio = TransformMarcToKoha( $marcrecord, $fw );
- $oldbiblio->{subtitle} = GetRecordValue('subtitle', $marcrecord, $fw);
+ $oldbiblio->{subtitle} = GetRecordValue('subtitle', $marcrecord);
$oldbiblio->{result_number} = $i + 1;
# add imageurl to itemtype if there is one
--- a/C4/ShelfBrowser.pm
+++ a/C4/ShelfBrowser.pm
@@ -223,12 +223,15 @@ sub GetShelfInfo {
my $this_biblio = GetBibData($item->{biblionumber});
next unless defined $this_biblio;
$item->{'title'} = $this_biblio->{'title'};
+ $item->{'subtitle'} = C4::Biblio::SplitSubtitle($this_biblio->{'subtitle'}),
+ $item->{'medium'} = $this_biblio->{'medium'};
+ $item->{'part_number'} = $this_biblio->{'part_number'};
+ $item->{'part_name'} = $this_biblio->{'part_name'};
my $this_record = GetMarcBiblio({ biblionumber => $this_biblio->{'biblionumber'} });
$item->{'browser_normalized_upc'} = GetNormalizedUPC($this_record,$marcflavour);
$item->{'browser_normalized_oclc'} = GetNormalizedOCLCNumber($this_record,$marcflavour);
$item->{'browser_normalized_isbn'} = GetNormalizedISBN(undef,$this_record,$marcflavour);
$item->{'browser_normalized_ean'} = GetNormalizedEAN($this_record,$marcflavour);
- $item->{'subtitle'} = GetRecordValue('subtitle', $this_record, GetFrameworkCode( $item->{biblionumber} ));
push @valid_items, $item;
}
return @valid_items;
@@ -239,7 +242,7 @@ sub GetBibData {
my ($bibnum) = @_;
my $dbh = C4::Context->dbh;
- my $sth = $dbh->prepare("SELECT biblionumber, title FROM biblio WHERE biblionumber=?");
+ my $sth = $dbh->prepare("SELECT biblionumber, title, subtitle, medium, part_number, part_name FROM biblio WHERE biblionumber=?");
$sth->execute($bibnum);
my $bib = $sth->fetchrow_hashref();
return $bib;
--- a/Koha/Biblio.pm
+++ a/Koha/Biblio.pm
@@ -65,20 +65,15 @@ sub store {
my @subtitles = $biblio->subtitles();
-Returns list of subtitles for a record.
-
-Keyword to MARC mapping for subtitle must be set for this method to return any possible values.
+Returns list of subtitles for a record according to the framework.
=cut
sub subtitles {
my ( $self ) = @_;
- return map { $_->{subfield} } @{
- C4::Biblio::GetRecordValue(
- 'subtitle',
- C4::Biblio::GetMarcBiblio({ biblionumber => $self->id }),
- $self->frameworkcode ) };
+ my @subtitles = split( / \| /, $self->subtitle // '' );
+ return @subtitles;
}
=head3 can_article_request
--- a/acqui/neworderbiblio.pl
+++ a/acqui/neworderbiblio.pl
@@ -129,8 +129,8 @@ my @results;
foreach my $result ( @{$marcresults} ) {
my $marcrecord = C4::Search::new_record_from_zebra( 'biblioserver', $result );
my $biblio = TransformMarcToKoha( $marcrecord, '' );
- $biblio->{subtitles} = GetRecordValue( 'subtitle', GetMarcBiblio({ biblionumber => $biblio->{biblionumber} }), GetFrameworkCode( $biblio->{biblionumber} ) );
+ $biblio->{subtitles} = C4::Biblio::SplitSubtitle($biblio->{'subtitle'});
$biblio->{booksellerid} = $booksellerid;
push @results, $biblio;
--- a/basket/basket.pl
+++ a/basket/basket.pl
@@ -59,12 +59,10 @@ if (C4::Context->preference('TagsEnabled')) {
foreach my $biblionumber ( @bibs ) {
$template->param( biblionumber => $biblionumber );
- my $fw = GetFrameworkCode($biblionumber);
-
my $dat = &GetBiblioData($biblionumber);
next unless $dat;
my $record = &GetMarcBiblio({ biblionumber => $biblionumber });
- $dat->{subtitle} = GetRecordValue('subtitle', $record, $fw);
+ $dat->{subtitle} = GetRecordValue('subtitle', $record);
my $marcnotesarray = GetMarcNotes( $record, $marcflavour );
my $marcauthorsarray = GetMarcAuthors( $record, $marcflavour );
my $marcsubjctsarray = GetMarcSubjects( $record, $marcflavour );
--- a/catalogue/detail.pl
+++ a/catalogue/detail.pl
@@ -141,7 +141,7 @@ my $marcsubjctsarray = GetMarcSubjects( $record, $marcflavour );
my $marcseriesarray = GetMarcSeries($record,$marcflavour);
my $marcurlsarray = GetMarcUrls ($record,$marcflavour);
my $marchostsarray = GetMarcHosts($record,$marcflavour);
-my $subtitle = GetRecordValue('subtitle', $record, $fw);
+my $subtitle = GetRecordValue('subtitle', $record);
my $itemtypes = { map { $_->{itemtype} => $_ } @{ Koha::ItemTypes->search->unblessed } };
--- a/catalogue/moredetail.pl
+++ a/catalogue/moredetail.pl
@@ -110,7 +110,7 @@ if (@hostitems){
push (@items,@hostitems);
}
-my $subtitle = GetRecordValue('subtitle', $record, $fw);
+my $subtitle = GetRecordValue('subtitle', $record);
my $totalcount=@all_items;
my $showncount=@items;
--- a/circ/branchoverdues.pl
+++ a/circ/branchoverdues.pl
@@ -74,13 +74,13 @@ if ($tagslib->{$tag}->{$subfield}->{authorised_value}) {
# now display infos
foreach my $num (@getoverdues) {
my %overdueforbranch;
- my $record = GetMarcBiblio({ biblionumber => $num->{biblionumber} });
- if ($record){
- $overdueforbranch{'subtitle'} = GetRecordValue('subtitle',$record,'')->[0]->{subfield};
- }
my $dt = dt_from_string($num->{date_due}, 'sql');
$overdueforbranch{'date_due'} = output_pref($dt);
$overdueforbranch{'title'} = $num->{'title'};
+ $overdueforbranch{'subtitle'} = $num->{'subtitle'};
+ $overdueforbranch{'medium'} = $num->{'medium'};
+ $overdueforbranch{'part_number'} = $num->{'part_number'};
+ $overdueforbranch{'part_name'} = $num->{'part_name'};
$overdueforbranch{'description'} = $num->{'description'};
$overdueforbranch{'barcode'} = $num->{'barcode'};
$overdueforbranch{'biblionumber'} = $num->{'biblionumber'};
--- a/circ/pendingreserves.pl
+++ a/circ/pendingreserves.pl
@@ -198,6 +198,10 @@ my $strsth =
GROUP_CONCAT(DISTINCT items.copynumber
ORDER BY items.itemnumber SEPARATOR '
') l_copynumber,
biblio.title,
+ biblio.subtitle,
+ biblio.medium,
+ biblio.part_number,
+ biblio.part_name,
biblio.author,
count(DISTINCT items.itemnumber) as icount,
count(DISTINCT reserves.borrowernumber) as rcount,
@@ -235,17 +239,16 @@ my $sth = $dbh->prepare($strsth);
$sth->execute(@query_params);
while ( my $data = $sth->fetchrow_hashref ) {
- my $record = Koha::Biblios->find($data->{biblionumber});
- if ($record){
- $data->{subtitle} = [ $record->subtitles ];
- }
push(
@reservedata, {
reservedate => $data->{l_reservedate},
firstname => $data->{firstname} || '',
surname => $data->{surname},
title => $data->{title},
- subtitle => $data->{subtitle},
+ subtitle => split(/ \| /, $data->{subtitle} // ''),
+ medium => $data->{medium},
+ part_number => $data->{part_number},
+ part_name => $data->{part_name},
author => $data->{author},
borrowernumber => $data->{borrowernumber},
biblionumber => $data->{biblionumber},
--- a/circ/reserveratios.pl
+++ a/circ/reserveratios.pl
@@ -27,7 +27,6 @@ use C4::Context;
use C4::Output;
use C4::Auth;
use C4::Debug;
-use C4::Biblio qw/GetMarcBiblio GetRecordValue GetFrameworkCode/;
use C4::Acquisition qw/GetOrdersByBiblionumber/;
use Koha::DateUtils;
use Koha::Acquisition::Baskets;
@@ -125,6 +124,10 @@ my $strsth =
reserves.found,
biblio.title,
+ biblio.subtitle,
+ biblio.medium,
+ biblio.part_number,
+ biblio.part_name,
biblio.author,
count(DISTINCT reserves.borrowernumber) as reservecount,
count(DISTINCT items.itemnumber) $include_aqorders_qty as itemcount
@@ -154,8 +157,6 @@ while ( my $data = $sth->fetchrow_hashref ) {
my $thisratio = $data->{reservecount} / $data->{itemcount};
my $ratiocalc = ($thisratio / $ratio);
($thisratio / $ratio) >= 1 or next; # TODO: tighter targeting -- get ratio limit into SQL using HAVING clause
- my $record = GetMarcBiblio({ biblionumber => $data->{biblionumber} });
- $data->{subtitle} = GetRecordValue('subtitle', $record, GetFrameworkCode($data->{biblionumber}));
push(
@reservedata,
{
@@ -163,7 +164,7 @@ while ( my $data = $sth->fetchrow_hashref ) {
priority => $data->{priority},
name => $data->{borrower},
title => $data->{title},
- subtitle => $data->{subtitle},
+ subtitle => C4::Biblio::SplitSubtitle($data->{'subtitle'});
author => $data->{author},
itemnum => $data->{itemnumber},
biblionumber => $data->{biblionumber},
--- a/circ/transferstoreceive.pl
+++ a/circ/transferstoreceive.pl
@@ -99,6 +99,10 @@ while ( my $library = $libraries->next ) {
%getransf = (
%getransf,
title => $biblio->title,
+ subtitle => C4::Biblio::SplitSubtitle($biblio->{'subtitle'}),
+ medium => $biblio->medium,
+ part_number => $biblio->part_number,
+ part_name => $biblio->part_name,
author => $biblio->author,
biblionumber => $biblio->biblionumber,
itemnumber => $item->itemnumber,
@@ -108,9 +112,6 @@ while ( my $library = $libraries->next ) {
itemcallnumber => $item->itemcallnumber,
);
- my $record = GetMarcBiblio({ biblionumber => $biblio->biblionumber });
- $getransf{'subtitle'} = GetRecordValue('subtitle', $record, $biblio->frameworkcode);
-
# we check if we have a reserv for this transfer
my $holds = $item->current_holds;
if ( my $first_hold = $holds->next ) {
--- a/koha-tmpl/intranet-tmpl/prog/en/includes/waiting_holds.inc
+++ a/koha-tmpl/intranet-tmpl/prog/en/includes/waiting_holds.inc
@@ -20,7 +20,7 @@
[% INCLUDE 'biblio-default-view.inc' biblionumber = reserveloo.biblionumber %] - [% reserveloo.title | html %] [% FOREACH s IN reserveloo.subtitle %] [% s | html %][% END %]
+ [% reserveloo.title | html %] [% FOREACH s IN reserveloo.subtitle %] [% s | html %][% END %] [% reserveloo.part_number | html %] [% reserveloo.part_name | html %] [% IF ( reserveloo.author ) %]by [% reserveloo.author | html %]
[% END %][% itemsloo.title | html %] [% FOREACH s IN itemsloo.subtitle %] [% s | html %][% END %]
+