X-Git-Url: http://koha-dev.rot13.org:8081/gitweb/?a=blobdiff_plain;f=opac%2Fopac-MARCdetail.pl;h=f55d6bf5efa7db5342c13792f94a839c6ec81457;hb=9d9ecdc49b4cb71aba99a7d7ca8bc89d426f7ca1;hp=695e4add960364a7588a95ba7bb412eae1d805c7;hpb=a529262501df8c0c0342829a2f33bd2bcfb19ec6;p=koha-ffzg.git diff --git a/opac/opac-MARCdetail.pl b/opac/opac-MARCdetail.pl index 695e4add96..f55d6bf5ef 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,58 +43,113 @@ the items attached to the biblio =cut -use strict; -use warnings; +use Modern::Perl; -use C4::Auth; +use C4::Auth qw( get_template_and_user ); use C4::Context; -use C4::Output; -use CGI; -use MARC::Record; -use C4::Biblio; -use C4::Acquisition; -use C4::Koha; - -my $query = new CGI; - -my $dbh = C4::Context->dbh; +use C4::Output qw( parametrized_url output_html_with_http_headers ); +use CGI qw ( -utf8 ); +use C4::Biblio qw( + CountItemsIssued + GetAuthorisedValueDesc + GetMarcControlnumber + GetMarcFromKohaField + GetMarcISSN + GetMarcStructure + TransformMarcToKoha +); +use C4::Reserves; +use C4::Members; +use C4::Koha qw( GetNormalizedISBN ); +use List::MoreUtils qw( uniq ); +use Koha::Biblios; +use Koha::CirculationRules; +use Koha::Items; +use Koha::ItemTypes; +use Koha::Patrons; +use Koha::RecordProcessor; +use Koha::DateUtils qw( output_pref ); +use Koha::Util::MARC; + +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, 1); -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 ), - debug => 1, } ); +my $patron = Koha::Patrons->find($loggedinuser); +my $biblio = Koha::Biblios->find($biblionumber); +my $record = $biblio->metadata->record; + +if ( ! $record ) { + print $query->redirect("/cgi-bin/koha/errors/404.pl"); + exit; +} + +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; + } +} + +my $items = $biblio->items->filter_by_visible_in_opac({ patron => $patron }); +my $framework = $biblio ? $biblio->frameworkcode : q{}; +my $tagslib = &GetMarcStructure( 0, $framework ); + +my $record_processor = Koha::RecordProcessor->new({ + filters => [ 'EmbedItems', 'ViewPolicy' ], + options => { + interface => 'opac', + frameworkcode => $framework, + items => [ $items->as_list ], + } +}); +$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' ); $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; -$template->param( 'AllowOnShelfHolds' => C4::Context->preference('AllowOnShelfHolds') ); -$template->param( 'ItemsIssued' => CountItemsIssued( $biblionumber ) ); +my $allow_onshelf_holds; +$items->reset; -# adding the $RequestOnOpac param -my $RequestOnOpac; -if (C4::Context->preference("RequestOnOpac")) { - $RequestOnOpac = 1; +while ( my $item = $items->next ) { + $allow_onshelf_holds = Koha::CirculationRules->get_onshelfholds_policy( { item => $item, patron => $patron } ) + unless $allow_onshelf_holds; +} + +if( $allow_onshelf_holds || CountItemsIssued($biblionumber) || $biblio->has_items_waiting_or_intransit ) { + $template->param( ReservableItems => 1 ); } # fill arrays my @loop_data = (); -my $tag; # loop through each tab 0 through 9 for ( my $tabloop = 0 ; $tabloop <= 9 ; $tabloop++ ) { @@ -141,12 +198,20 @@ for ( my $tabloop = 0 ; $tabloop <= 9 ; $tabloop++ ) { # loop through each subfield for my $i ( 0 .. $#subf ) { $subf[$i][0] = "@" unless defined($subf[$i][0]); - my $sf_def = $tagslib->{ $fields[$x_i]->tag() }->{ $subf[$i][0] }; - next if ( ($sf_def->{tab}||0) != $tabloop ); - next if ( ($sf_def->{hidden}||0) > 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 +245,13 @@ for ( my $tabloop = 0 ; $tabloop <= 9 ; $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,102 +269,115 @@ for ( my $tabloop = 0 ; $tabloop <= 9 ; $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}||0) != 10 ); next if ( ($sf_def->{hidden}||0) > 0 ); + + push @item_subfield_codes, $subf[$i][0]; $witness{ $subf[$i][0] } = $sf_def->{lib}; + # Allow repeatables (BZ 13574) + if( $item->{$subf[$i][0]} ) { + $item->{$subf[$i][0]} .= ' | '; + } else { + $item->{$subf[$i][0]} = q{}; + } + 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], - $subf[$i][1], '', $tagslib, '', 'opac' ); + $item->{ $subf[$i][0] } .= GetAuthorisedValueDesc( $field->tag(), $subf[$i][0], + $subf[$i][1], '', $tagslib, '', 'opac' ) // q{}; } - } - if (%this_row) { - push( @big_array, \%this_row ); - } -} -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} ); - } -} -# 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 $kohafield = $tagslib->{ $field->tag() }->{ $subf[$i][0] }->{kohafield}; + $item->{ $subf[$i][0] } = output_pref( { str => $item->{ $subf[$i][0] }, dateonly => 1 } ) + if grep { $kohafield eq $_ } + qw( items.dateaccessioned items.onloan items.datelastseen items.datelastborrowed items.replacementpricedate ); + } - my %row_data; - $row_data{item_value} = $items_data; - push( @item_value_loop, \%row_data ); + push @item_loop, $item if $item; } - -foreach my $subfield_code ( keys(%witness) ) { - my %header_value; - $header_value{header_value} = $witness{$subfield_code}; - push( @header_value_loop, \%header_value ); +my ( $holdingbrtagf, $holdingbrtagsubf ) = + &GetMarcFromKohaField( "items.holdingbranch" ); +@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} ||= " " + } } -if(C4::Context->preference("ISBD")) { - $template->param(ISBD => 1); +if ( C4::Context->preference("OPACISBD") ) { + $template->param( ISBD => 1 ); } -#Export options -my $OpacExportOptions=C4::Context->preference("OpacExportOptions"); -my @export_options = split(/\|/,$OpacExportOptions); -$template->{VARS}->{'export_options'} = \@export_options; - #Search for title in links my $marcflavour = C4::Context->preference("marcflavour"); -my $dat = TransformMarcToKoha( $dbh, $record ); +my $dat = TransformMarcToKoha({ record => $record }); my $isbn = GetNormalizedISBN(undef,$record,$marcflavour); my $marccontrolnumber = GetMarcControlnumber ($record, $marcflavour); my $marcissns = GetMarcISSN( $record, $marcflavour ); my $issn = $marcissns->[0] || ''; if (my $search_for_title = C4::Context->preference('OPACSearchForTitleIn')){ - $dat->{author} ? $search_for_title =~ s/{AUTHOR}/$dat->{author}/g : $search_for_title =~ s/{AUTHOR}//g; $dat->{title} =~ s/\/+$//; # remove trailing slash $dat->{title} =~ s/\s+$//; # remove trailing space - $dat->{title} ? $search_for_title =~ s/{TITLE}/$dat->{title}/g : $search_for_title =~ s/{TITLE}//g; - $isbn ? $search_for_title =~ s/{ISBN}/$isbn/g : $search_for_title =~ s/{ISBN}//g; - $issn ? $search_for_title =~ s/{ISSN}/$issn/g : $search_for_title =~ s/{ISSN}//g; - $marccontrolnumber ? $search_for_title =~ s/{CONTROLNUMBER}/$marccontrolnumber/g : $search_for_title =~ s/{CONTROLNUMBER}//g; - $search_for_title =~ s/{BIBLIONUMBER}/$biblionumber/g; - $template->param('OPACSearchForTitleIn' => $search_for_title); + my $oclc_no = Koha::Util::MARC::oclc_number( $record ); + $search_for_title = parametrized_url( + $search_for_title, + { + TITLE => $dat->{title}, + AUTHOR => $dat->{author}, + ISBN => $isbn, + ISSN => $issn, + CONTROLNUMBER => $marccontrolnumber, + BIBLIONUMBER => $biblionumber, + OCLC_NO => $oclc_no, + } + ); + $template->param('OPACSearchForTitleIn' => $search_for_title); +} + +if( C4::Context->preference('ArticleRequests') ) { + my $itemtype = Koha::ItemTypes->find($biblio->itemtype); + my $artreqpossible = $patron + ? $biblio->can_article_request( $patron ) + : $itemtype + ? $itemtype->may_article_request + : q{}; + $template->param( artreqpossible => $artreqpossible ); } +my $norequests = ! $biblio->items->filter_by_for_hold->count; $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, + norequests => $norequests, ); output_html_with_http_headers $query, $cookie, $template->output;