@@ -, +, @@ --- 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 | 11 +++-- 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, 146 insertions(+), 101 deletions(-) --- a/C4/Biblio.pm +++ a/C4/Biblio.pm @@ -68,6 +68,7 @@ BEGIN { TransformHtmlToMarc TransformHtmlToXml prepare_host_field + SplitSubtitle ); # Internal functions @@ -635,39 +636,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; } @@ -3614,6 +3609,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 @@ -132,7 +132,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) @@ -147,19 +152,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 @@ -707,6 +707,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 @@ -83,20 +83,15 @@ sub metadata { 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,10 +239,6 @@ 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}, @@ -246,6 +246,9 @@ while ( my $data = $sth->fetchrow_hashref ) { surname => $data->{surname}, title => $data->{title}, subtitle => $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 %]
+