X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;f=opac%2Fopac-detail.pl;h=a7e643c4e1c41cd9659277b2ab69597394732a48;hb=7afddcb157a8d8e27cfdee3cdbeb0eae483aa24c;hp=c5f9a6f9234f9845744419f050c8ad33d3347763;hpb=ebccf4099fd2762e24773ebb13b5099f10991101;p=koha.git diff --git a/opac/opac-detail.pl b/opac/opac-detail.pl index c5f9a6f923..a7e643c4e1 100755 --- a/opac/opac-detail.pl +++ b/opac/opac-detail.pl @@ -6,27 +6,25 @@ # # This file is part of Koha. # -# Koha is free software; you can redistribute it and/or modify it under the -# terms of the GNU General Public License as published by the Free Software -# Foundation; either version 2 of the License, or (at your option) any later -# version. +# Koha is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. # -# Koha is distributed in the hope that it will be useful, but WITHOUT ANY -# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR -# A PARTICULAR PURPOSE. See the GNU General Public License for more details. +# Koha is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. # -# You should have received a copy of the GNU General Public License along -# with Koha; if not, write to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +# You should have received a copy of the GNU General Public License +# along with Koha; if not, see . -use strict; -use warnings; +use Modern::Perl; use CGI qw ( -utf8 ); use C4::Acquisition qw( SearchOrders ); use C4::Auth qw(:DEFAULT get_session); -use C4::Branch; use C4::Koha; use C4::Serials; #uses getsubscriptionfrom biblionumber use C4::Output; @@ -37,10 +35,7 @@ use C4::Tags qw(get_tags); use C4::XISBN qw(get_xisbns get_biblionumber_from_isbn); 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::Review; -use C4::Ratings; use C4::Members; -use C4::VirtualShelves; use C4::XSLT; use C4::ShelfBrowser; use C4::Reserves; @@ -52,6 +47,11 @@ use C4::Images; use Koha::DateUtils; use C4::HTML5Media; use C4::CourseReserves qw(GetItemCourseReservesInfo); +use Koha::RecordProcessor; +use Koha::AuthorisedValues; +use Koha::Virtualshelves; +use Koha::Ratings; +use Koha::Reviews; BEGIN { if (C4::Context->preference('BakerTaylorEnabled')) { @@ -67,7 +67,6 @@ my ( $template, $borrowernumber, $cookie ) = get_template_and_user( query => $query, type => "opac", authnotrequired => ( C4::Context->preference("OpacPublic") ? 1 : 0 ), - flagsrequired => { borrow => 1 }, } ); @@ -85,11 +84,20 @@ if (scalar @all_items >= 1) { } } -my $record = GetMarcBiblio($biblionumber); +my $record = GetMarcBiblio($biblionumber); if ( ! $record ) { print $query->redirect("/cgi-bin/koha/errors/404.pl"); # escape early exit; } +my $framework = &GetFrameworkCode( $biblionumber ); +my $record_processor = Koha::RecordProcessor->new({ + filters => 'ViewPolicy', + options => { + interface => 'opac', + frameworkcode => $framework + } +}); +$record_processor->process($record); # redirect if opacsuppression is enabled and biblio is suppressed if (C4::Context->preference('OpacSuppression')) { @@ -141,8 +149,17 @@ my $marcflavour = C4::Context->preference("marcflavour"); my $ean = GetNormalizedEAN( $record, $marcflavour ); # XSLT processing of some stuff -if (C4::Context->preference("OPACXSLTDetailsDisplay") ) { - $template->param( 'XSLTBloc' => XSLTParse4Display($biblionumber, $record, "OPACXSLTDetailsDisplay" ) ); +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"); @@ -188,7 +205,6 @@ if ($session->param('busc')) { my ($arrParamsBusc, $offset, $results_per_page) = @_; my $expanded_facet = $arrParamsBusc->{'expand'}; - my $branches = GetBranches(); my $itemtypes = GetItemTypes; my @servers; @servers = @{$arrParamsBusc->{'server'}} if $arrParamsBusc->{'server'}; @@ -200,7 +216,7 @@ 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,$branches,$itemtypes,$arrParamsBusc->{'query_type'},$arrParamsBusc->{'scan'}); + ($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 $hits; my @newresults; @@ -480,7 +496,6 @@ if ($hideitems) { @items = @all_items; } -my $branches = GetBranches(); my $branch = ''; if (C4::Context->userenv){ $branch = C4::Context->userenv->{branch}; @@ -491,19 +506,19 @@ if ( C4::Context->preference('HighlightOwnItemsOnOPAC') ) { || C4::Context->preference('HighlightOwnItemsOnOPACWhich') eq 'OpacURLBranch' ) { - my $branchname; + my $branchcode; if ( C4::Context->preference('HighlightOwnItemsOnOPACWhich') eq 'PatronBranch' ) { - $branchname = $branches->{$branch}->{'branchname'}; + $branchcode = $branch; } elsif ( C4::Context->preference('HighlightOwnItemsOnOPACWhich') eq 'OpacURLBranch' ) { - $branchname = $branches->{ $ENV{'BRANCHCODE'} }->{'branchname'}; + $branchcode = $ENV{'BRANCHCODE'}; } my @our_items; my @other_items; foreach my $item ( @items ) { - if ( $item->{'branchname'} eq $branchname ) { + if ( $item->{branchcode} eq $branchcode ) { $item->{'this_branch'} = 1; push( @our_items, $item ); } else { @@ -516,21 +531,30 @@ if ( C4::Context->preference('HighlightOwnItemsOnOPAC') ) { } my $dat = &GetBiblioData($biblionumber); +my $HideMARC = $record_processor->filters->[0]->should_hide_marc( + { + frameworkcode => $dat->{'frameworkcode'}, + interface => 'opac', + } ); my $itemtypes = GetItemTypes(); # imageurl: my $itemtype = $dat->{'itemtype'}; if ( $itemtype ) { $dat->{'imageurl'} = getitemtypeimagelocation( 'opac', $itemtypes->{$itemtype}->{'imageurl'} ); - $dat->{'description'} = $itemtypes->{$itemtype}->{'description'}; + $dat->{'description'} = $itemtypes->{$itemtype}->{translated_description}; } -my $shelflocations =GetKohaAuthorisedValues('items.location',$dat->{'frameworkcode'}, 'opac'); -my $collections = GetKohaAuthorisedValues('items.ccode',$dat->{'frameworkcode'}, 'opac'); -my $copynumbers = GetKohaAuthorisedValues('items.copynumber',$dat->{'frameworkcode'}, 'opac'); + +my $shelflocations = + { map { $_->{authorised_value} => $_->{opac_description} } Koha::AuthorisedValues->get_descriptions_by_koha_field( { frameworkcode => $dat->{frameworkcode}, kohafield => 'items.location' } ) }; +my $collections = + { map { $_->{authorised_value} => $_->{opac_description} } Koha::AuthorisedValues->get_descriptions_by_koha_field( { frameworkcode => $dat->{frameworkcode}, kohafield => 'items.ccode' } ) }; +my $copynumbers = + { map { $_->{authorised_value} => $_->{opac_description} } Koha::AuthorisedValues->get_descriptions_by_koha_field( { frameworkcode => $dat->{frameworkcode}, kohafield => 'items.copynumber' } ) }; #coping with subscriptions my $subscriptionsnumber = CountSubscriptionFromBiblionumber($biblionumber); -my @subscriptions = GetSubscriptions($dat->{'title'}, $dat->{'issn'}, $ean, $biblionumber ); +my @subscriptions = SearchSubscriptions({ biblionumber => $biblionumber, orderby => 'title' }); my @subs; $dat->{'serial'}=1 if $subscriptionsnumber; @@ -544,7 +568,6 @@ foreach my $subscription (@subscriptions) { $cell{histstartdate} = $subscription->{histstartdate}; $cell{histenddate} = $subscription->{histenddate}; $cell{branchcode} = $subscription->{branchcode}; - $cell{branchname} = GetBranchName($subscription->{branchcode}); $cell{hasalert} = $subscription->{hasalert}; $cell{callnumber} = $subscription->{callnumber}; $cell{closed} = $subscription->{closed}; @@ -560,8 +583,6 @@ foreach my $subscription (@subscriptions) { $dat->{'count'} = scalar(@items); -my $biblio_authorised_value_images = C4::Items::get_authorised_value_images( C4::Biblio::get_biblio_authorised_values( $biblionumber, $record ) ); - my (%item_reserves, %priority); my ($show_holds_count, $show_priority); for ( C4::Context->preference("OPACShowHoldQueueDetails") ) { @@ -648,21 +669,12 @@ if ( not $viewallitems and @items > $max_items_to_display ) { } if (exists $itm->{itype} && defined($itm->{itype}) && exists $itemtypes->{ $itm->{itype} }) { $itm->{'imageurl'} = getitemtypeimagelocation( 'opac', $itemtypes->{ $itm->{itype} }->{'imageurl'} ); - $itm->{'description'} = $itemtypes->{ $itm->{itype} }->{'description'}; + $itm->{'description'} = $itemtypes->{ $itm->{itype} }->{translated_description}; } foreach (qw(ccode enumchron copynumber itemnotes uri)) { $itemfields{$_} = 1 if ($itm->{$_}); } - # walk through the item-level authorised values and populate some images - my $item_authorised_value_images = C4::Items::get_authorised_value_images( C4::Items::get_item_authorised_values( $itm->{'itemnumber'} ) ); - # warn( Data::Dumper->Dump( [ $item_authorised_value_images ], [ 'item_authorised_value_images' ] ) ); - - if ( $itm->{'itemlost'} ) { - my $lostimageinfo = List::Util::first { $_->{'category'} eq 'LOST' } @$item_authorised_value_images; - $itm->{'lostimageurl'} = $lostimageinfo->{ 'imageurl' }; - $itm->{'lostimagelabel'} = $lostimageinfo->{ 'label' }; - } my $reserve_status = C4::Reserves::GetReserveStatus($itm->{itemnumber}); if( $reserve_status eq "Waiting"){ $itm->{'waiting'} = 1; } if( $reserve_status eq "Reserved"){ $itm->{'onhold'} = 1; } @@ -670,8 +682,8 @@ if ( not $viewallitems and @items > $max_items_to_display ) { my ( $transfertwhen, $transfertfrom, $transfertto ) = GetTransfers($itm->{itemnumber}); if ( defined( $transfertwhen ) && $transfertwhen ne '' ) { $itm->{transfertwhen} = $transfertwhen; - $itm->{transfertfrom} = $branches->{$transfertfrom}{branchname}; - $itm->{transfertto} = $branches->{$transfertto}{branchname}; + $itm->{transfertfrom} = $transfertfrom; + $itm->{transfertto} = $transfertto; } if ( C4::Context->preference('OPACAcquisitionDetails') @@ -704,24 +716,29 @@ if (scalar(@itemloop) == 0 || scalar(@otheritemloop) == 0) { } ## get notes and subjects from MARC record -my $dbh = C4::Context->dbh; +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 $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); my $subtitle = GetRecordValue('subtitle', $record, GetFrameworkCode($biblionumber)); $template->param( MARCNOTES => $marcnotesarray, - MARCSUBJCTS => $marcsubjctsarray, - MARCAUTHORS => $marcauthorsarray, - MARCSERIES => $marcseriesarray, - MARCURLS => $marcurlsarray, - MARCISBNS => $marcisbnsarray, - MARCHOSTS => $marchostsarray, norequests => $norequests, RequestOnOpac => C4::Context->preference("RequestOnOpac"), itemdata_ccode => $itemfields{ccode}, @@ -729,7 +746,6 @@ my $subtitle = GetRecordValue('subtitle', $record, GetFrameworkCode($bib itemdata_uri => $itemfields{uri}, itemdata_copynumber => $itemfields{copynumber}, itemdata_itemnotes => $itemfields{itemnotes}, - authorised_value_images => $biblio_authorised_value_images, subtitle => $subtitle, OpacStarRatings => C4::Context->preference("OpacStarRatings"), ); @@ -761,7 +777,9 @@ if (C4::Context->preference("AlternateHoldingsField") && scalar @items == 0) { ); } +# FIXME: The template uses this hash directly. Need to filter. foreach ( keys %{$dat} ) { + next if ( $HideMARC->{$_} ); $template->param( "$_" => defined $dat->{$_} ? $dat->{$_} : '' ); } @@ -788,44 +806,49 @@ $template->param( ocoins => GetCOinSBiblio($record), ); -my $libravatar_enabled = 0; -if ( C4::Context->preference('ShowReviewer') and C4::Context->preference('ShowReviewerPhoto')) { - eval { - require Libravatar::URL; - Libravatar::URL->import(); - }; - if (!$@ ) { - $libravatar_enabled = 1; +my ( $loggedincommenter, $reviews ); +if ( C4::Context->preference('reviewson') ) { + $reviews = Koha::Reviews->search( + { + biblionumber => $biblionumber, + -or => { approved => 1, borrowernumber => $borrowernumber } + }, + { + order_by => { -desc => 'datereviewed' } + } + )->unblessed; + my $libravatar_enabled = 0; + if ( C4::Context->preference('ShowReviewer') and C4::Context->preference('ShowReviewerPhoto') ) { + eval { + require Libravatar::URL; + Libravatar::URL->import(); + }; + if ( !$@ ) { + $libravatar_enabled = 1; + } } -} - -my $reviews = getreviews( $biblionumber, 1 ); -my $loggedincommenter; - - - + for my $review (@$reviews) { + my $borrowerData = GetMember( 'borrowernumber' => $review->{borrowernumber} ); + + # setting some borrower info into this hash + $review->{title} = $borrowerData->{'title'}; + $review->{surname} = $borrowerData->{'surname'}; + $review->{firstname} = $borrowerData->{'firstname'}; + if ( $libravatar_enabled and $borrowerData->{'email'} ) { + $review->{avatarurl} = libravatar_url( email => $borrowerData->{'email'}, https => $ENV{HTTPS} ); + } + $review->{userid} = $borrowerData->{'userid'}; + $review->{cardnumber} = $borrowerData->{'cardnumber'}; -foreach ( @$reviews ) { - my $borrowerData = GetMember('borrowernumber' => $_->{borrowernumber}); - # setting some borrower info into this hash - $_->{title} = $borrowerData->{'title'}; - $_->{surname} = $borrowerData->{'surname'}; - $_->{firstname} = $borrowerData->{'firstname'}; - if ($libravatar_enabled and $borrowerData->{'email'}) { - $_->{avatarurl} = libravatar_url(email => $borrowerData->{'email'}, https => $ENV{HTTPS}); + if ( $borrowerData->{'borrowernumber'} eq $borrowernumber ) { + $review->{your_comment} = 1; + $loggedincommenter = 1; + } } - $_->{userid} = $borrowerData->{'userid'}; - $_->{cardnumber} = $borrowerData->{'cardnumber'}; - - if ($borrowerData->{'borrowernumber'} eq $borrowernumber) { - $_->{your_comment} = 1; - $loggedincommenter = 1; - } } - -if(C4::Context->preference("ISBD")) { - $template->param(ISBD => 1); +if ( C4::Context->preference("OPACISBD") ) { + $template->param( ISBD => 1 ); } $template->param( @@ -840,12 +863,19 @@ $template->param( ); # Lists - if (C4::Context->preference("virtualshelves") ) { - $template->param( 'GetShelves' => GetBibliosShelves( $biblionumber ) ); + my $shelves = Koha::Virtualshelves->search( + { + biblionumber => $biblionumber, + category => 2, + }, + { + join => 'virtualshelfcontents', + } + ); + $template->param( shelves => $shelves ); } - # XISBN Stuff if (C4::Context->preference("OPACFRBRizeEditions")==1) { eval { @@ -1061,12 +1091,11 @@ if (C4::Context->preference("OPACURLOpenInNewWindow")) { } if ( C4::Context->preference('OpacStarRatings') !~ /disable/ ) { - my $rating = GetRating( $biblionumber, $borrowernumber ); + my $ratings = Koha::Ratings->search({ biblionumber => $biblionumber }); + my $my_rating = $borrowernumber ? $ratings->search({ borrowernumber => $borrowernumber })->next : undef; $template->param( - rating_value => $rating->{'rating_value'}, - rating_total => $rating->{'rating_total'}, - rating_avg => $rating->{'rating_avg'}, - rating_avg_int => $rating->{'rating_avg_int'}, + ratings => $ratings, + my_rating => $my_rating, borrowernumber => $borrowernumber ); } @@ -1093,16 +1122,33 @@ if (my $search_for_title = C4::Context->preference('OPACSearchForTitleIn')){ $template->param('OPACSearchForTitleIn' => $search_for_title); } +#IDREF +if ( C4::Context->preference("IDREF") ) { + # If the record comes from the SUDOC + if ( $record->field('009') ) { + my $unimarc3 = $record->field("009")->data; + if ( $unimarc3 =~ /^\d+$/ ) { + $template->param( + IDREF => 1, + ); + } + } +} + # We try to select the best default tab to show, according to what # the user wants, and what's available for display my $opac_serial_default = C4::Context->preference('opacSerialDefaultTab'); my $defaulttab = + $viewallitems + ? 'holdings' : $opac_serial_default eq 'subscriptions' && $subscriptionsnumber ? 'subscriptions' : $opac_serial_default eq 'serialcollection' && @serialcollections > 0 ? 'serialcollection' : $opac_serial_default eq 'holdings' && scalar (@itemloop) > 0 ? 'holdings' : + scalar (@itemloop) == 0 + ? 'media' : $subscriptionsnumber ? 'subscriptions' : @serialcollections > 0