X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;f=opac%2Fopac-MARCdetail.pl;h=4867eda8607f5a87e8872e9c86bc923be2f268ba;hb=6d3136c7e893011bd7cdfd0b6415d20929b6a66b;hp=8e492aa70167bffbb0dca06c4c2246f8d7b9eb57;hpb=d1cea14fae6525b7478548aa19108871395e198d;p=koha.git diff --git a/opac/opac-MARCdetail.pl b/opac/opac-MARCdetail.pl index 8e492aa701..4867eda860 100755 --- a/opac/opac-MARCdetail.pl +++ b/opac/opac-MARCdetail.pl @@ -1,26 +1,28 @@ #!/usr/bin/perl -# Copyright 2000-2002 Katipo Communications -# Parts copyright 2010 BibLibre -# # 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. +# Copyright (C) 2000-2002 Katipo Communications +# Parts Copyright (C) 2010 BibLibre +# Parts Copyright (C) 2013 Mark Tompsett +# +# 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 . + =head1 NAME -MARCdetail.pl : script to show a biblio in MARC format +opac-MARCdetail.pl : script to show a biblio in MARC format =head1 SYNOPSIS @@ -33,7 +35,7 @@ This script needs a biblionumber as parameter It shows the biblio in a (nice) MARC format depending on MARC parameters tables. -The template is in /catalogue/MARCdetail.tmpl. +The template is in /catalogue/MARCdetail.tt. this template must be divided into 11 "tabs". The first 10 tabs present the biblio, the 11th one presents @@ -41,35 +43,40 @@ the items attached to the biblio =cut -use strict; -use warnings; +use Modern::Perl; use C4::Auth; use C4::Context; use C4::Output; -use CGI; +use CGI qw ( -utf8 ); use MARC::Record; use C4::Biblio; +use C4::Items; +use C4::Reserves; +use C4::Members; use C4::Acquisition; use C4::Koha; +use List::MoreUtils qw( any uniq ); +use Koha::Biblios; +use Koha::IssuingRules; +use Koha::Items; +use Koha::ItemTypes; +use Koha::Patrons; +use Koha::RecordProcessor; -my $query = new CGI; - -my $dbh = C4::Context->dbh; +my $query = CGI->new(); my $biblionumber = $query->param('biblionumber'); -my $itemtype = &GetFrameworkCode($biblionumber); -my $tagslib = &GetMarcStructure( 0, $itemtype ); -my $biblio = GetBiblioData($biblionumber); -my $record = GetMarcBiblio($biblionumber); -if ( ! $record ) { +if ( ! $biblionumber ) { print $query->redirect("/cgi-bin/koha/errors/404.pl"); exit; } +$biblionumber = int($biblionumber); + # open template my ( $template, $loggedinuser, $cookie ) = get_template_and_user( { - template_name => "opac-MARCdetail.tmpl", + template_name => "opac-MARCdetail.tt", query => $query, type => "opac", authnotrequired => ( C4::Context->preference("OpacPublic") ? 1 : 0 ), @@ -77,12 +84,67 @@ my ( $template, $loggedinuser, $cookie ) = get_template_and_user( } ); +my $patron = Koha::Patrons->find( $loggedinuser ); +my $borcat = q{}; +if ( C4::Context->preference('OpacHiddenItemsExceptions') ) { + # we need to fetch the borrower info here, so we can pass the category + $borcat = $patron ? $patron->categorycode : $borcat; +} + +my $record = GetMarcBiblio({ + biblionumber => $biblionumber, + embed_items => 1, + opac => 1, + borcat => $borcat }); +if ( ! $record ) { + print $query->redirect("/cgi-bin/koha/errors/404.pl"); + exit; +} + +my @all_items = GetItemsInfo($biblionumber); +my $biblio = Koha::Biblios->find( $biblionumber ); +my $framework = $biblio ? $biblio->frameworkcode : q{}; +my $tagslib = &GetMarcStructure( 0, $framework ); +my ($tag_itemnumber,$subtag_itemnumber) = &GetMarcFromKohaField('items.itemnumber',$framework); +my @nonhiddenitems = $record->field($tag_itemnumber); +if (scalar @all_items >= 1 && scalar @nonhiddenitems == 0) { + print $query->redirect("/cgi-bin/koha/errors/404.pl"); + exit; +} + +my $record_processor = Koha::RecordProcessor->new({ + filters => 'ViewPolicy', + options => { + interface => 'opac', + frameworkcode => $framework + } +}); +$record_processor->process($record); + +# get biblionumbers stored in the cart +if(my $cart_list = $query->cookie("bib_list")){ + my @cart_list = split(/\//, $cart_list); + if ( grep {$_ eq $biblionumber} @cart_list) { + $template->param( incart => 1 ); + } +} + +my ($bt_tag,$bt_subtag) = GetMarcFromKohaField('biblio.title',$framework); $template->param( - bibliotitle => $biblio->{title}, -); + bibliotitle => $biblio->title, +) if $tagslib->{$bt_tag}->{$bt_subtag}->{hidden} <= 0 && # <=0 OPAC visible. + $tagslib->{$bt_tag}->{$bt_subtag}->{hidden} > -8; # except -8; + +my $allow_onshelf_holds; +for my $itm (@all_items) { + my $item = Koha::Items->find( $itm->{itemnumber} ); + $allow_onshelf_holds = Koha::IssuingRules->get_onshelfholds_policy( { item => $item, patron => $patron } ); + last if $allow_onshelf_holds; +} -$template->param( 'AllowOnShelfHolds' => C4::Context->preference('AllowOnShelfHolds') ); -$template->param( 'ItemsIssued' => CountItemsIssued( $biblionumber ) ); +if( $allow_onshelf_holds || CountItemsIssued($biblionumber) || $biblio->has_items_waiting_or_intransit ) { + $template->param( ReservableItems => 1 ); +} # adding the $RequestOnOpac param my $RequestOnOpac; @@ -95,7 +157,7 @@ my @loop_data = (); my $tag; # loop through each tab 0 through 9 -for ( my $tabloop = 0 ; $tabloop <= 10 ; $tabloop++ ) { +for ( my $tabloop = 0 ; $tabloop <= 9 ; $tabloop++ ) { # loop through each tag my @loop_data = (); @@ -140,13 +202,21 @@ for ( my $tabloop = 0 ; $tabloop <= 10 ; $tabloop++ ) { my $previous = ''; # loop through each subfield for my $i ( 0 .. $#subf ) { - $subf[$i][0] = "@" unless $subf[$i][0]; - my $sf_def = $tagslib->{ $fields[$x_i]->tag() }->{ $subf[$i][0] }; - next if ( $sf_def->{tab} ne $tabloop ); - next if ( $sf_def->{hidden} > 0 ); + $subf[$i][0] = "@" unless defined($subf[$i][0]); + my $sf_def = $tagslib->{ $fields[$x_i]->tag() }; + $sf_def = $sf_def->{ $subf[$i][0] } if defined($sf_def); + my ($tab,$hidden,$lib); + $tab = $sf_def->{tab} if defined($sf_def); + $tab = $tab // int($fields[$x_i]->tag()/100); + $hidden = $sf_def->{hidden} if defined($sf_def); + $hidden = $hidden // 0; + next if ( $tab != $tabloop ); + next if ( $hidden > 0 ); my %subfield_data; - $subfield_data{marc_lib} = ($sf_def->{lib} eq $previous) ? '--' : $sf_def->{lib}; - $previous = $sf_def->{lib}; + $lib = $sf_def->{lib} if defined($sf_def); + $lib = $lib // '--'; + $subfield_data{marc_lib} = ($lib eq $previous) ? '--' : $lib; + $previous = $lib; $subfield_data{link} = $sf_def->{link}; $subf[$i][1] =~ s/\n//g; if ( $sf_def->{isurl} ) { @@ -180,12 +250,13 @@ for ( my $tabloop = 0 ; $tabloop <= 10 ; $tabloop++ ) { $tag_data{tag} = $tagslib->{ $fields[$x_i]->tag() }->{lib}; } else { - $tag_data{tag} = - $fields[$x_i]->tag() - . ' ' + my $sf_def = $tagslib->{ $fields[$x_i]->tag() }; + my $lib; + $lib = $sf_def->{lib} if defined($sf_def); + $lib = $lib // ''; + $tag_data{tag} = $fields[$x_i]->tag() . ' ' . C4::Koha::display_marc_indicators($fields[$x_i]) - . ' - ' - . $tagslib->{ $fields[$x_i]->tag() }->{lib}; + . " - $lib"; } } my @tmp = @subfields_data; @@ -203,87 +274,94 @@ for ( my $tabloop = 0 ; $tabloop <= 10 ; $tabloop++ ) { # loop through each tag # warning : we may have differents number of columns in each row. Thus, we first build a hash, complete it if necessary # then construct template. +# $record has already had all the item fields filtered above. my @fields = $record->fields(); my %witness ; #---- stores the list of subfields used at least once, with the "meaning" of the code -my @big_array; +my @item_subfield_codes; +my @item_loop; foreach my $field (@fields) { next if ( $field->tag() < 10 ); my @subf = $field->subfields; - my %this_row; + my $item; # loop through each subfield for my $i ( 0 .. $#subf ) { my $sf_def = $tagslib->{ $field->tag() }->{ $subf[$i][0] }; - next if ( $sf_def->{tab} ne 10 ); - next if ( $sf_def->{hidden} > 0 ); + next if ( ($sf_def->{tab}||0) != 10 ); + next if ( ($sf_def->{hidden}||0) > 0 ); + push @item_subfield_codes, $subf[$i][0]; $witness{ $subf[$i][0] } = $sf_def->{lib}; if ( $sf_def->{isurl} ) { - $this_row{ $subf[$i][0] } = "$subf[$i][1]"; + $item->{ $subf[$i][0] } = "$subf[$i][1]"; } elsif ( $sf_def->{kohafield} eq "biblioitems.isbn" ) { - $this_row{ $subf[$i][0] } = $subf[$i][1]; + $item->{ $subf[$i][0] } = $subf[$i][1]; } else { - $this_row{ $subf[$i][0] } = GetAuthorisedValueDesc( $field->tag(), $subf[$i][0], + $item->{ $subf[$i][0] } = GetAuthorisedValueDesc( $field->tag(), $subf[$i][0], $subf[$i][1], '', $tagslib, '', 'opac' ); } } - if (%this_row) { - push( @big_array, \%this_row ); - } + push @item_loop, $item if $item; } my ( $holdingbrtagf, $holdingbrtagsubf ) = - &GetMarcFromKohaField( "items.holdingbranch", $itemtype ); -@big_array = - sort { $a->{$holdingbrtagsubf} cmp $b->{$holdingbrtagsubf} } @big_array; - -#fill big_row with missing datas -foreach my $subfield_code ( keys(%witness) ) { - for ( my $i = 0 ; $i <= $#big_array ; $i++ ) { - $big_array[$i]{$subfield_code} = " " - unless ( $big_array[$i]{$subfield_code} ); - } + &GetMarcFromKohaField( "items.holdingbranch", $framework ); +@item_loop = + sort { ($a->{$holdingbrtagsubf}||'') cmp ($b->{$holdingbrtagsubf}||'') } @item_loop; + +@item_subfield_codes = uniq @item_subfield_codes; +# fill item info +my @item_header_loop; +for my $subfield_code ( @item_subfield_codes ) { + push @item_header_loop, $witness{$subfield_code}; + for my $item_data ( @item_loop ) { + $item_data->{$subfield_code} ||= " " + } } -# now, construct template ! -my @item_value_loop; -my @header_value_loop; -for ( my $i = 0 ; $i <= $#big_array ; $i++ ) { - my $items_data; - foreach my $subfield_code ( keys(%witness) ) { - $items_data .= "" . $big_array[$i]{$subfield_code} . ""; - } - my %row_data; - $row_data{item_value} = $items_data; - push( @item_value_loop, \%row_data ); +if ( C4::Context->preference("OPACISBD") ) { + $template->param( ISBD => 1 ); } -foreach my $subfield_code ( keys(%witness) ) { - my %header_value; - $header_value{header_value} = $witness{$subfield_code}; - push( @header_value_loop, \%header_value ); -} +#Search for title in links +my $marcflavour = C4::Context->preference("marcflavour"); +my $dat = TransformMarcToKoha( $record ); +my $isbn = GetNormalizedISBN(undef,$record,$marcflavour); +my $marccontrolnumber = GetMarcControlnumber ($record, $marcflavour); +my $marcissns = GetMarcISSN( $record, $marcflavour ); +my $issn = $marcissns->[0] || ''; -if(C4::Context->preference("ISBD")) { - $template->param(ISBD => 1); +if (my $search_for_title = C4::Context->preference('OPACSearchForTitleIn')){ + $dat->{title} =~ s/\/+$//; # remove trailing slash + $dat->{title} =~ s/\s+$//; # remove trailing space + $search_for_title = parametrized_url( + $search_for_title, + { + TITLE => $dat->{title}, + AUTHOR => $dat->{author}, + ISBN => $isbn, + ISSN => $issn, + CONTROLNUMBER => $marccontrolnumber, + BIBLIONUMBER => $biblionumber, + } + ); + $template->param('OPACSearchForTitleIn' => $search_for_title); } -#Search for title in links -if (my $search_for_title = C4::Context->preference('OPACSearchForTitleIn')){ - $biblio->{author} ? $search_for_title =~ s/{AUTHOR}/$biblio->{author}/g : $search_for_title =~ s/{AUTHOR}//g; - $biblio->{title} =~ s/\/+$//; # remove trailing slash - $biblio->{title} =~ s/\s+$//; # remove trailing space - $biblio->{title} ? $search_for_title =~ s/{TITLE}/$biblio->{title}/g : $search_for_title =~ s/{TITLE}//g; - $biblio->{isbn} ? $search_for_title =~ s/{ISBN}/$biblio->{isbn}/g : $search_for_title =~ s/{ISBN}//g; - $template->param('OPACSearchForTitleIn' => $search_for_title); +if( C4::Context->preference('ArticleRequests') ) { + my $artreqpossible = $patron + ? $biblio->can_article_request( $patron ) + : Koha::ItemTypes->find($biblio->itemtype)->may_article_request; + $template->param( artreqpossible => $artreqpossible ); } $template->param( - item_loop => \@item_value_loop, - item_header_loop => \@header_value_loop, - biblionumber => $biblionumber, + item_loop => \@item_loop, + item_header_loop => \@item_header_loop, + item_subfield_codes => \@item_subfield_codes, + biblio => $biblio, ); output_html_with_http_headers $query, $cookie, $template->output;