X-Git-Url: http://koha-dev.rot13.org:8081/gitweb/?a=blobdiff_plain;f=opac%2Fopac-detail.pl;h=961be881435483c25625e08068dd174adc708db9;hb=217ccf2eaebe847937e0961b307382758caf6338;hp=c859771590a9097c9377abcd32cca11c0638499d;hpb=d99d32d033935f09b7c361177ac4b43f08b8c14a;p=srvgit diff --git a/opac/opac-detail.pl b/opac/opac-detail.pl index c859771590..961be88143 100755 --- a/opac/opac-detail.pl +++ b/opac/opac-detail.pl @@ -24,55 +24,76 @@ use Modern::Perl; use CGI qw ( -utf8 ); use C4::Acquisition qw( SearchOrders ); -use C4::Auth qw(:DEFAULT get_session); -use C4::Koha; -use C4::Serials; #uses getsubscriptionfrom biblionumber -use C4::Output; -use C4::Biblio; -use C4::Items; -use C4::Circulation; -use C4::Tags qw(get_tags); -use C4::XISBN qw(get_xisbns); -use C4::External::Amazon; -use C4::External::Syndetics qw(get_syndetics_index get_syndetics_summary get_syndetics_toc get_syndetics_excerpt get_syndetics_reviews get_syndetics_anotes ); +use C4::Auth qw( get_template_and_user get_session ); +use C4::Koha qw( + getitemtypeimagelocation + GetNormalizedEAN + GetNormalizedISBN + GetNormalizedOCLCNumber + GetNormalizedUPC +); +use C4::Search qw( new_record_from_zebra searchResults getRecords ); +use C4::Serials qw( CountSubscriptionFromBiblionumber SearchSubscriptions GetLatestSerials ); +use C4::Output qw( parametrized_url output_html_with_http_headers ); +use C4::Biblio qw( + CountItemsIssued + GetBiblioData + GetMarcControlnumber + GetMarcISBN + GetMarcISSN + GetMarcSeries + GetMarcSubjects + GetMarcUrls +); +use C4::Tags qw( get_tags ); +use C4::XISBN qw( get_xisbns ); +use C4::External::Amazon qw( get_amazon_tld ); +use C4::External::BakerTaylor qw( image_url link_url ); +use C4::External::Syndetics qw( + get_syndetics_anotes + get_syndetics_excerpt + get_syndetics_index + get_syndetics_reviews + get_syndetics_summary + get_syndetics_toc +); use C4::Members; -use C4::XSLT; -use C4::ShelfBrowser; -use C4::Reserves; -use C4::Charset; -use C4::Letters; -use MARC::Record; +use C4::XSLT qw( XSLTParse4Display ); +use C4::ShelfBrowser qw( GetNearbyItems ); +use C4::Reserves qw( GetReserveStatus ); +use C4::Charset qw( SetUTF8Flag ); use MARC::Field; -use List::MoreUtils qw/any none/; -use C4::Images; -use Koha::DateUtils; +use List::MoreUtils qw( any ); use C4::HTML5Media; -use C4::CourseReserves qw(GetItemCourseReservesInfo); +use C4::CourseReserves qw( GetItemCourseReservesInfo ); use Koha::Biblios; use Koha::RecordProcessor; use Koha::AuthorisedValues; -use Koha::IssuingRules; +use Koha::CirculationRules; use Koha::Items; use Koha::ItemTypes; use Koha::Acquisition::Orders; use Koha::Virtualshelves; use Koha::Patrons; +use Koha::Plugins; use Koha::Ratings; use Koha::Reviews; +use Koha::Serial::Items; +use Koha::SearchEngine::Search; +use Koha::SearchEngine::QueryBuilder; +use Koha::Util::MARC; -BEGIN { - if (C4::Context->preference('BakerTaylorEnabled')) { - require C4::External::BakerTaylor; - import C4::External::BakerTaylor qw(&image_url &link_url); - } -} +use JSON qw( decode_json ); my $query = CGI->new(); my $biblionumber = $query->param('biblionumber') || $query->param('bib') || 0; $biblionumber = int($biblionumber); +my $specific_item = $query->param('itemnumber') ? Koha::Items->find( scalar $query->param('itemnumber') ) : undef; +$biblionumber = $specific_item->biblionumber if $specific_item; + my ( $template, $borrowernumber, $cookie ) = get_template_and_user( { template_name => "opac-detail.tt", @@ -82,33 +103,33 @@ my ( $template, $borrowernumber, $cookie ) = get_template_and_user( } ); -my @all_items = GetItemsInfo($biblionumber); -my @hiddenitems; my $patron = Koha::Patrons->find( $borrowernumber ); -our $borcat= q{}; -if ( C4::Context->preference('OpacHiddenItemsExceptions') ) { - $borcat = $patron ? $patron->categorycode : q{}; -} -my $record = GetMarcBiblio({ - biblionumber => $biblionumber, - opac => 1 }); -if ( ! $record ) { +my $biblio = Koha::Biblios->find( $biblionumber ); +my $record = $biblio ? $biblio->metadata->record : undef; +unless ( $biblio && $record ) { print $query->redirect("/cgi-bin/koha/errors/404.pl"); # escape early exit; } -if ( scalar @all_items >= 1 ) { - push @hiddenitems, - GetHiddenItemnumbers( { items => \@all_items, borcat => $borcat } ); +my $items = $biblio->items->search_ordered; +if ($specific_item) { + $items = $items->search( { itemnumber => scalar $query->param('itemnumber') } ); + $template->param( specific_item => 1 ); +} - if (scalar @hiddenitems == scalar @all_items ) { - print $query->redirect("/cgi-bin/koha/errors/404.pl"); # escape early +unless ( $patron and $patron->category->override_hidden_items ) { + # only skip this check if there's a logged in user + # and its category overrides OpacHiddenItems + if ( $biblio->hidden_in_opac({ rules => C4::Context->yaml_preference('OpacHiddenItems') }) ) { + print $query->redirect('/cgi-bin/koha/errors/404.pl'); # escape early exit; } + if ( $items->count >= 1 ) { + $items = $items->filter_by_visible_in_opac( { patron => $patron } ); + } } -my $biblio = Koha::Biblios->find( $biblionumber ); my $framework = $biblio ? $biblio->frameworkcode : q{}; my $record_processor = Koha::RecordProcessor->new({ filters => 'ViewPolicy', @@ -150,7 +171,9 @@ if (C4::Context->preference('OpacSuppression')) { } } -$template->param( biblio => $biblio ); +$template->param( + biblio => $biblio +); # get biblionumbers stored in the cart my @cart_list; @@ -168,20 +191,6 @@ SetUTF8Flag($record); my $marcflavour = C4::Context->preference("marcflavour"); my $ean = GetNormalizedEAN( $record, $marcflavour ); -# XSLT processing of some stuff -my $xslfile = C4::Context->preference('OPACXSLTDetailsDisplay'); -my $lang = $xslfile ? C4::Languages::getlanguage() : undef; -my $sysxml = $xslfile ? C4::XSLT::get_xslt_sysprefs() : undef; - -if ( $xslfile ) { - $template->param( - XSLTBloc => XSLTParse4Display( - $biblionumber, $record, "OPACXSLTDetailsDisplay", - 1, undef, $sysxml, $xslfile, $lang - ) - ); -} - my $OpacBrowseResults = C4::Context->preference("OpacBrowseResults"); # We look for the busc param to build the simple paging from the search @@ -189,8 +198,7 @@ if ($OpacBrowseResults) { my $session = get_session($query->cookie("CGISESSID")); my %paging = (previous => {}, next => {}); if ($session->param('busc')) { - use C4::Search; - use URI::Escape; + use URI::Escape qw( uri_escape_utf8 uri_unescape ); # Rebuild the string to store on session # param value is URI encoded and params separator is HTML encode (&) @@ -222,9 +230,8 @@ if ($session->param('busc')) { # Search given the current values from the busc param sub searchAgain { - my ($arrParamsBusc, $offset, $results_per_page) = @_; + my ($arrParamsBusc, $offset, $results_per_page, $patron) = @_; - my $expanded_facet = $arrParamsBusc->{'expand'}; my $itemtypes = { map { $_->{itemtype} => $_ } @{ Koha::ItemTypes->search_with_localization->unblessed } }; my @servers; @servers = @{$arrParamsBusc->{'server'}} if $arrParamsBusc->{'server'}; @@ -236,13 +243,16 @@ if ($session->param('busc')) { $sort_by[0] = $default_sort_by if !$sort_by[0] && defined($default_sort_by); my ($error, $results_hashref, $facets); eval { - ($error, $results_hashref, $facets) = getRecords($arrParamsBusc->{'query'},$arrParamsBusc->{'simple_query'},\@sort_by,\@servers,$results_per_page,$offset,$expanded_facet,undef,$itemtypes,$arrParamsBusc->{'query_type'},$arrParamsBusc->{'scan'}); + my $searcher = Koha::SearchEngine::Search->new( + { index => $Koha::SearchEngine::BIBLIOS_INDEX } ); + my $json = JSON->new->utf8->allow_nonref(1); + ($error, $results_hashref, $facets) = $searcher->search_compat($json->decode($arrParamsBusc->{'query'}),$arrParamsBusc->{'simple_query'},\@sort_by,\@servers,$results_per_page,$offset,undef,$itemtypes,$arrParamsBusc->{'query_type'},$arrParamsBusc->{'scan'}); }; my $hits; my @newresults; my $search_context = { - 'interface' => 'opac', - 'category' => $borcat + interface => 'opac', + patron => $patron, }; for (my $i=0;$i<@servers;$i++) { my $server = $servers[$i]; @@ -304,7 +314,7 @@ if ($session->param('busc')) { } $arrParamsBusc{'count'} = $count; $results_per_page = $count; - my $newresultsRef = searchAgain(\%arrParamsBusc, $offset, $results_per_page); + my $newresultsRef = searchAgain(\%arrParamsBusc, $offset, $results_per_page, $patron); $arrParamsBusc{'listBiblios'} = buildListBiblios($newresultsRef, $results_per_page); delete $arrParamsBusc{'previous'} if (exists($arrParamsBusc{'previous'})); delete $arrParamsBusc{'next'} if (exists($arrParamsBusc{'next'})); @@ -415,7 +425,7 @@ if ($session->param('busc')) { $offsetSearch = 0 if (defined($offsetSearch) && $offsetSearch < 0); } if ($searchAgain) { - my $newresultsRef = searchAgain(\%arrParamsBusc, $offsetSearch, $results_per_page); + my $newresultsRef = searchAgain(\%arrParamsBusc, $offsetSearch, $results_per_page, $patron); my @newresults = @$newresultsRef; # build the new listBiblios my $listBiblios = buildListBiblios(\@newresults, $results_per_page); @@ -469,7 +479,8 @@ if ($session->param('busc')) { for (my $j = 0; $j < @arrBiblios; $j++) { next unless ($arrBiblios[$j]); $dataBiblioPaging = Koha::Biblios->find( $arrBiblios[$j] ) if ($arrBiblios[$j] != $biblionumber); - push @listResults, {index => $j + 1 + $offset, biblionumber => $arrBiblios[$j], title => ($arrBiblios[$j] == $biblionumber)?'':$dataBiblioPaging->title, author => ($arrBiblios[$j] != $biblionumber && $dataBiblioPaging->author)?$dataBiblioPaging->author:'', url => ($arrBiblios[$j] == $biblionumber)?'':'opac-detail.pl?biblionumber=' . $arrBiblios[$j]}; + next unless $dataBiblioPaging; + push @listResults, {index => $j + 1 + $offset, biblionumber => $arrBiblios[$j], title => ($arrBiblios[$j] == $biblionumber)?'':$dataBiblioPaging->title, author => ($arrBiblios[$j] != $biblionumber && $dataBiblioPaging->author)?$dataBiblioPaging->author:'', part_number => ($arrBiblios[$j] == $biblionumber)?'':$dataBiblioPaging->part_number, part_name => ($arrBiblios[$j] == $biblionumber)?'':$dataBiblioPaging->part_name, url => ($arrBiblios[$j] == $biblionumber)?'':'opac-detail.pl?biblionumber=' . $arrBiblios[$j]}; } $template->param('listResults' => \@listResults) if (@listResults); $template->param('indexPag' => 1 + $offset, 'totalPag' => $arrParamsBusc{'total'}, 'indexPagEnd' => scalar(@arrBiblios) + $offset); @@ -481,79 +492,17 @@ $template->param( OPACShowCheckoutName => C4::Context->preference("OPACShowCheckoutName"), ); -if ( C4::Context->preference('EasyAnalyticalRecords') ) { - # adding items linked via host biblios - my $analyticfield = '773'; - if ($marcflavour eq 'MARC21' || $marcflavour eq 'NORMARC'){ - $analyticfield = '773'; - } elsif ($marcflavour eq 'UNIMARC') { - $analyticfield = '461'; - } - foreach my $hostfield ( $record->field($analyticfield)) { - my $hostbiblionumber = $hostfield->subfield("0"); - my $linkeditemnumber = $hostfield->subfield("9"); - my @hostitemInfos = GetItemsInfo($hostbiblionumber); - foreach my $hostitemInfo (@hostitemInfos){ - if ($hostitemInfo->{itemnumber} eq $linkeditemnumber){ - push(@all_items, $hostitemInfo); - } +$items = Koha::Items->search_ordered( + [ + 'me.biblionumber' => $biblionumber, + 'me.itemnumber' => { + -in => [ + $biblio->host_items->get_column('itemnumber') + ] } - } -} - -my @items; - -# Are there items to hide? -my $hideitems; -$hideitems = 1 if C4::Context->preference('hidelostitems') or scalar(@hiddenitems) > 0; - -# Hide items -if ($hideitems) { - for my $itm (@all_items) { - if ( C4::Context->preference('hidelostitems') ) { - push @items, $itm unless $itm->{itemlost} or any { $itm->{'itemnumber'} eq $_ } @hiddenitems; - } else { - push @items, $itm unless any { $itm->{'itemnumber'} eq $_ } @hiddenitems; - } -} -} else { - # Or not - @items = @all_items; -} - -my $branch = ''; -if (C4::Context->userenv){ - $branch = C4::Context->userenv->{branch}; -} -if ( C4::Context->preference('HighlightOwnItemsOnOPAC') ) { - if ( - ( ( C4::Context->preference('HighlightOwnItemsOnOPACWhich') eq 'PatronBranch' ) && $branch ) - || - C4::Context->preference('HighlightOwnItemsOnOPACWhich') eq 'OpacURLBranch' - ) { - my $branchcode; - if ( C4::Context->preference('HighlightOwnItemsOnOPACWhich') eq 'PatronBranch' ) { - $branchcode = $branch; - } - elsif ( C4::Context->preference('HighlightOwnItemsOnOPACWhich') eq 'OpacURLBranch' ) { - $branchcode = $ENV{'BRANCHCODE'}; - } - - my @our_items; - my @other_items; - - foreach my $item ( @items ) { - if ( $item->{branchcode} eq $branchcode ) { - $item->{'this_branch'} = 1; - push( @our_items, $item ); - } else { - push( @other_items, $item ); - } - } - - @items = ( @our_items, @other_items ); - } -} + ], + { prefetch => [ 'issue', 'homebranch', 'holdingbranch' ] } +)->filter_by_visible_in_opac({ patron => $patron }) unless $specific_item; my $dat = &GetBiblioData($biblionumber); my $HideMARC = $record_processor->filters->[0]->should_hide_marc( @@ -612,8 +561,7 @@ foreach my $subscription (@subscriptions) { push @subs, \%cell; } -$dat->{'count'} = scalar(@items); - +$dat->{'count'} = $items->count; my (%item_reserves, %priority); my ($show_holds_count, $show_priority); @@ -637,7 +585,6 @@ if ( $show_holds_count || $show_priority) { } $template->param( show_priority => $has_hold ) ; -my $norequests = 1; my %itemfields; my (@itemloop, @otheritemloop); my $currentbranch = C4::Context->userenv ? C4::Context->userenv->{branch} : undef; @@ -648,20 +595,66 @@ my $separatebranch = C4::Context->preference('OpacSeparateHoldingsBranch'); my $viewallitems = $query->param('viewallitems'); my $max_items_to_display = C4::Context->preference('OpacMaxItemsToDisplay') // 50; +# Get component parts details +my $showcomp = C4::Context->preference('ShowComponentRecords'); +my ( $parts, $show_analytics ); +if ( $showcomp eq 'both' || $showcomp eq 'opac' ) { + if ( my $components = $biblio->get_marc_components(C4::Context->preference('MaxComponentRecords')) ) { + $show_analytics = 1 if @{$components}; # just show link when having results + for my $part ( @{$components} ) { + $part = C4::Search::new_record_from_zebra( 'biblioserver', $part ); + my $id = Koha::SearchEngine::Search::extract_biblionumber( $part ); + + push @{$parts}, + XSLTParse4Display( + { + biblionumber => $id, + record => $part, + xsl_syspref => 'OPACXSLTResultsDisplay', + fix_amps => 1, + } + ); + } + $template->param( ComponentParts => $parts ); + my ( $comp_query, $comp_query_str, $comp_sort ) = $biblio->get_components_query; + my $cpq = $comp_query_str . "&sort_by=" . $comp_sort; + $template->param( ComponentPartsQuery => $cpq ); + } +} else { # check if we should show analytics anyway + $show_analytics = 1 if @{$biblio->get_marc_components(1)}; # count matters here, results does not +} + +# XSLT processing of some stuff +my $variables = {}; +my $lang = C4::Languages::getlanguage(); +my @plugin_responses = Koha::Plugins->call( + 'opac_detail_xslt_variables', + { + biblio_id => $biblionumber, + lang => $lang, + patron_id => $borrowernumber, + }, +); +for my $plugin_variables ( @plugin_responses ) { + $variables = { %$variables, %$plugin_variables }; +} +$variables->{anonymous_session} = $borrowernumber ? 0 : 1; +$variables->{show_analytics_link} = $show_analytics; +$template->param( + XSLTBloc => XSLTParse4Display({ + biblionumber => $biblionumber, + record => $record, + xsl_syspref => 'OPACXSLTDetailsDisplay', + fix_amps => 1, + xslt_variables => $variables, + }), +); + # Get items on order -my ( @itemnumbers_on_order ); if ( C4::Context->preference('OPACAcquisitionDetails' ) ) { - my $orders = C4::Acquisition::SearchOrders({ - biblionumber => $biblionumber, - ordered => 1, - }); + my $orders = $biblio->orders->filter_by_active; my $total_quantity = 0; - for my $order ( @$orders ) { - my $order = Koha::Acquisition::Orders->find( $order->{ordernumber} ); - my $basket = $order->basket; - if ( $basket->effective_create_items eq 'ordering' ) { - @itemnumbers_on_order = $order->items->get_column('itemnumber'); - } + while ( my $order = $orders->next ) { $total_quantity += $order->quantity; } $template->{VARS}->{acquisition_details} = { @@ -670,76 +663,115 @@ if ( C4::Context->preference('OPACAcquisitionDetails' ) ) { } my $allow_onshelf_holds; -if ( not $viewallitems and @items > $max_items_to_display ) { +my ( $itemloop_has_images, $otheritemloop_has_images ); +if ( not $viewallitems and $items->count > $max_items_to_display ) { $template->param( too_many_items => 1, - items_count => scalar( @items ), + items_count => $items->count, ); -} else { - for my $itm (@items) { - my $item = Koha::Items->find( $itm->{itemnumber} ); - $itm->{holds_count} = $item_reserves{ $itm->{itemnumber} }; - $itm->{priority} = $priority{ $itm->{itemnumber} }; - $norequests = 0 - if $norequests - && !$itm->{'withdrawn'} - && !$itm->{'itemlost'} - && ($itm->{'itemnotforloan'}<0 || not $itm->{'itemnotforloan'}) - && !$itemtypes->{$itm->{'itype'}}->{notforloan} - && $itm->{'itemnumber'}; - - $allow_onshelf_holds = Koha::IssuingRules->get_onshelfholds_policy( { item => $item, patron => $patron } ) - unless $allow_onshelf_holds; - - # get collection code description, too - my $ccode = $itm->{'ccode'}; - $itm->{'ccode'} = $collections->{$ccode} if defined($ccode) && $collections && exists( $collections->{$ccode} ); - my $copynumber = $itm->{'copynumber'}; - $itm->{'copynumber'} = $copynumbers->{$copynumber} if ( defined($copynumbers) && defined($copynumber) && exists( $copynumbers->{$copynumber} ) ); - if ( defined $itm->{'location'} ) { - $itm->{'location_description'} = $shelflocations->{ $itm->{'location'} }; - } - if (exists $itm->{itype} && defined($itm->{itype}) && exists $itemtypes->{ $itm->{itype} }) { - $itm->{'imageurl'} = getitemtypeimagelocation( 'opac', $itemtypes->{ $itm->{itype} }->{'imageurl'} ); - $itm->{'description'} = $itemtypes->{ $itm->{itype} }->{translated_description}; - } - foreach (qw(ccode enumchron copynumber itemnotes location_description uri)) { - $itemfields{$_} = 1 if ($itm->{$_}); - } +} +else { + my $library_info; + while ( my $item = $items->next ) { + my $item_info = $item->unblessed; + $item_info->{holds_count} = $item_reserves{ $item->itemnumber }; + $item_info->{priority} = $priority{ $item->itemnumber }; + + # Get opac_info from Additional contents for home and holding library + my ( $opac_info_home, $opac_info_holding ); + $opac_info_holding = $library_info->{ $item->holdingbranch } // $item->holding_branch->opac_info({ lang => $lang }); + $library_info->{ $item->holdingbranch } = $opac_info_holding; + $opac_info_home = $library_info->{ $item->homebranch } // $item->home_branch->opac_info({ lang => $lang }); + $library_info->{ $item->homebranch } = $opac_info_home; + $item_info->{holding_library_info} = $opac_info_holding->content if $opac_info_holding; + $item_info->{home_library_info} = $opac_info_home->content if $opac_info_home; + + $allow_onshelf_holds = Koha::CirculationRules->get_onshelfholds_policy( + { item => $item, patron => $patron } ) + unless $allow_onshelf_holds; + + # get collection code description, too + my $ccode = $item->ccode; + $item_info->{'ccode'} = $collections->{$ccode} + if defined($ccode) + && $collections + && exists( $collections->{$ccode} ); + + my $copynumber = $item->copynumber; + $item_info->{copynumber} = $copynumbers->{$copynumber} + if ( defined($copynumbers) + && defined($copynumber) + && exists( $copynumbers->{$copynumber} ) ); + + if ( defined $item->location ) { + $item_info->{'location_description'} = + $shelflocations->{ $item->location }; + } - my $reserve_status = C4::Reserves::GetReserveStatus($itm->{itemnumber}); - if( $reserve_status eq "Waiting"){ $itm->{'waiting'} = 1; } - if( $reserve_status eq "Reserved"){ $itm->{'onhold'} = 1; } - - my ( $transfertwhen, $transfertfrom, $transfertto ) = GetTransfers($itm->{itemnumber}); - if ( defined( $transfertwhen ) && $transfertwhen ne '' ) { - $itm->{transfertwhen} = $transfertwhen; - $itm->{transfertfrom} = $transfertfrom; - $itm->{transfertto} = $transfertto; - } - - if ( C4::Context->preference('OPACAcquisitionDetails') ) { - $itm->{on_order} = 1 - if grep /^$itm->{itemnumber}$/, @itemnumbers_on_order; - } + my $itemtype = $item->itemtype; + $item_info->{'imageurl'} = getitemtypeimagelocation( 'opac', + $itemtypes->{ $itemtype->itemtype }->{'imageurl'} ); + $item_info->{'description'} = + $itemtypes->{ $itemtype->itemtype }->{translated_description}; - my $itembranch = $itm->{$separatebranch}; - if ($currentbranch and C4::Context->preference('OpacSeparateHoldings')) { - if ($itembranch and $itembranch eq $currentbranch) { - push @itemloop, $itm; - } else { - push @otheritemloop, $itm; + foreach my $field ( + qw(ccode materials enumchron copynumber itemnotes location_description uri) + ) + { + $itemfields{$field} = 1 if $item_info->{$field}; + } + + # FIXME The following must be Koha::Item->serial + my $serial_item = Koha::Serial::Items->find($item->itemnumber); + if ( $serial_item ) { + $item_info->{serial} = $serial_item; + } + + $item_info->{checkout} = $item->checkout; + $item_info->{object} = $item; + + + if ( C4::Context->preference("OPACLocalCoverImages") == 1 ) { + $item_info->{cover_images} = $item->cover_images; + } + + + if ( C4::Context->preference('UseCourseReserves') ) { + $item_info->{course_reserves} = GetItemCourseReservesInfo( itemnumber => $item->itemnumber ); + } + + $item_info->{holding_branch} = $item->holding_branch; + $item_info->{home_branch} = $item->home_branch; + + my $itembranch = $item->$separatebranch; + if ( $currentbranch + and C4::Context->preference('OpacSeparateHoldings') ) + { + if ( $itembranch and $itembranch eq $currentbranch ) { + push @itemloop, $item_info; + $itemloop_has_images++ if $item->cover_images->count; + } + else { + push @otheritemloop, $item_info; + $otheritemloop_has_images++ if $item->cover_images->count; + } + } + else { + push @itemloop, $item_info; + $itemloop_has_images++ if $item->cover_images->count; } - } else { - push @itemloop, $itm; } - } } if( $allow_onshelf_holds || CountItemsIssued($biblionumber) || $biblio->has_items_waiting_or_intransit ) { $template->param( ReservableItems => 1 ); } +$template->param( + itemloop_has_images => $itemloop_has_images, + otheritemloop_has_images => $otheritemloop_has_images, +); + # Display only one tab if one items list is empty if (scalar(@itemloop) == 0 || scalar(@otheritemloop) == 0) { $template->param(SeparateHoldings => 0); @@ -748,27 +780,7 @@ if (scalar(@itemloop) == 0 || scalar(@otheritemloop) == 0) { } } -## get notes and subjects from MARC record -if (!C4::Context->preference("OPACXSLTDetailsDisplay") ) { - my $marcisbnsarray = GetMarcISBN ($record,$marcflavour); - my $marcauthorsarray = GetMarcAuthors ($record,$marcflavour); - my $marcsubjctsarray = GetMarcSubjects($record,$marcflavour); - my $marcseriesarray = GetMarcSeries ($record,$marcflavour); - my $marcurlsarray = GetMarcUrls ($record,$marcflavour); - my $marchostsarray = GetMarcHosts($record,$marcflavour); - - $template->param( - MARCSUBJCTS => $marcsubjctsarray, - MARCAUTHORS => $marcauthorsarray, - MARCSERIES => $marcseriesarray, - MARCURLS => $marcurlsarray, - MARCISBNS => $marcisbnsarray, - MARCHOSTS => $marchostsarray, - ); -} - -my $marcnotesarray = GetMarcNotes ($record,$marcflavour); -my $subtitle = GetRecordValue('subtitle', $record, GetFrameworkCode($biblionumber)); +my $marcnotesarray = $biblio->get_marc_notes({ opac => 1, record => $record }); if( C4::Context->preference('ArticleRequests') ) { my $patron = $borrowernumber ? Koha::Patrons->find($borrowernumber) : undef; @@ -781,21 +793,21 @@ if( C4::Context->preference('ArticleRequests') ) { $template->param( artreqpossible => $artreqpossible ); } +my $norequests = ! $biblio->items->filter_by_for_hold->count; $template->param( MARCNOTES => $marcnotesarray, norequests => $norequests, - RequestOnOpac => C4::Context->preference("RequestOnOpac"), itemdata_ccode => $itemfields{ccode}, + itemdata_materials => $itemfields{materials}, itemdata_enumchron => $itemfields{enumchron}, itemdata_uri => $itemfields{uri}, itemdata_copynumber => $itemfields{copynumber}, itemdata_itemnotes => $itemfields{itemnotes}, itemdata_location => $itemfields{location_description}, - subtitle => $subtitle, OpacStarRatings => C4::Context->preference("OpacStarRatings"), ); -if (C4::Context->preference("AlternateHoldingsField") && scalar @items == 0) { +if (C4::Context->preference("AlternateHoldingsField") && $items->count == 0) { my $fieldspec = C4::Context->preference("AlternateHoldingsField"); my $subfields = substr $fieldspec, 3; my $holdingsep = C4::Context->preference("AlternateHoldingsSeparator") || ' '; @@ -846,11 +858,13 @@ $template->param( content_identifier_exists => $content_identifier_exists, ); +# Catch the exception as Koha::Biblio::Metadata->record can explode if the MARCXML is invalid # COinS format FIXME: for books Only -$template->param( ocoins => $biblio->get_coins ); +my $coins = eval { $biblio->get_coins }; +$template->param( ocoins => $coins ); my ( $loggedincommenter, $reviews ); -if ( C4::Context->preference('reviewson') ) { +if ( C4::Context->preference('OPACComments') ) { $reviews = Koha::Reviews->search( { biblionumber => $biblionumber, @@ -906,7 +920,7 @@ if (C4::Context->preference("virtualshelves") ) { my $shelves = Koha::Virtualshelves->search( { biblionumber => $biblionumber, - category => 2, + public => 1, }, { join => 'virtualshelfcontents', @@ -919,7 +933,7 @@ if (C4::Context->preference("virtualshelves") ) { if (C4::Context->preference("OPACFRBRizeEditions")==1) { eval { $template->param( - XISBNS => scalar get_xisbns($isbn) + XISBNS => scalar get_xisbns($isbn, $biblionumber) ); }; if ($@) { warn "XISBN Failed $@"; } @@ -1148,6 +1162,7 @@ my $issn = $marcissns->[0] || ''; if (my $search_for_title = C4::Context->preference('OPACSearchForTitleIn')){ $dat->{title} =~ s/\/+$//; # remove trailing slash $dat->{title} =~ s/\s+$//; # remove trailing space + my $oclc_no = Koha::Util::MARC::oclc_number( $record ); $search_for_title = parametrized_url( $search_for_title, { @@ -1157,6 +1172,7 @@ if (my $search_for_title = C4::Context->preference('OPACSearchForTitleIn')){ ISSN => $issn, CONTROLNUMBER => $marccontrolnumber, BIBLIONUMBER => $biblionumber, + OCLC_NO => $oclc_no, } ); $template->param('OPACSearchForTitleIn' => $search_for_title); @@ -1187,6 +1203,8 @@ my $defaulttab = ? 'serialcollection' : $opac_serial_default eq 'holdings' && scalar (@itemloop) > 0 ? 'holdings' : + ( $showcomp eq 'both' || $showcomp eq 'opac' ) && scalar (@itemloop) == 0 && $parts + ? 'components' : scalar (@itemloop) == 0 ? 'media' : $subscriptionsnumber @@ -1196,13 +1214,9 @@ my $defaulttab = $template->param('defaulttab' => $defaulttab); if (C4::Context->preference('OPACLocalCoverImages') == 1) { - my @images = ListImagesForBiblio($biblionumber); - $template->{VARS}->{localimages} = \@images; + $template->param( localimages => $biblio->cover_images ); } -$template->{VARS}->{IDreamBooksReviews} = C4::Context->preference('IDreamBooksReviews'); -$template->{VARS}->{IDreamBooksReadometer} = C4::Context->preference('IDreamBooksReadometer'); -$template->{VARS}->{IDreamBooksResults} = C4::Context->preference('IDreamBooksResults'); $template->{VARS}->{OPACPopupAuthorsSearch} = C4::Context->preference('OPACPopupAuthorsSearch'); if (C4::Context->preference('OpacHighlightedWords')) { @@ -1210,14 +1224,26 @@ if (C4::Context->preference('OpacHighlightedWords')) { } $template->{VARS}->{'trackclicks'} = C4::Context->preference('TrackClicks'); -if ( C4::Context->preference('UseCourseReserves') ) { - foreach my $i ( @items ) { - $i->{'course_reserves'} = GetItemCourseReservesInfo( itemnumber => $i->{'itemnumber'} ); - } -} - $template->param( 'OpacLocationBranchToDisplay' => C4::Context->preference('OpacLocationBranchToDisplay'), ); +if ( C4::Context->preference('OPACAuthorIdentifiers') ) { + my @author_identifiers; + for my $author ( @{ $biblio->get_marc_authors } ) { + my $authid = $author->{authoritylink}; + my $authority = Koha::Authorities->find($authid); + next unless $authority; + my $identifiers = $authority->get_identifiers; + next unless $identifiers && @$identifiers; + my ($name) = + map { $_->{value} } + grep { $_->{code} eq 'a' ? $_ : () } + @{ $author->{MARCAUTHOR_SUBFIELDS_LOOP} }; + push @author_identifiers, + { authid => $authid, name => $name, identifiers => $identifiers }; + } + $template->param( author_identifiers => \@author_identifiers ); +} + output_html_with_http_headers $query, $cookie, $template->output;