X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;f=opac%2Fopac-MARCdetail.pl;h=3c9c2c23c8fb13c8979056d26d41f40c98cc49df;hb=8dad1582c100017f8ad3e331c9a9b9cc9ed4e4d6;hp=f408cd299b9444b832e02704ceebcaf6b3d976a5;hpb=d508f0244bd288066d62dcaa40244702b2581514;p=koha.git diff --git a/opac/opac-MARCdetail.pl b/opac/opac-MARCdetail.pl index f408cd299b..3c9c2c23c8 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,67 @@ 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::RecordProcessor; my $query = new CGI; my $dbh = C4::Context->dbh; my $biblionumber = $query->param('biblionumber'); -my $itemtype = &GetFrameworkCode($biblionumber); -my $tagslib = &GetMarcStructure( 0, $itemtype ); -my $biblio = GetBiblioData($biblionumber); +if ( ! $biblionumber ) { + print $query->redirect("/cgi-bin/koha/errors/404.pl"); + exit; +} + my $record = GetMarcBiblio($biblionumber, 1); if ( ! $record ) { print $query->redirect("/cgi-bin/koha/errors/404.pl"); exit; } + +my @all_items = GetItemsInfo($biblionumber); +my @items2hide; +if (scalar @all_items >= 1) { + push @items2hide, GetHiddenItemnumbers(@all_items); + + if (scalar @items2hide == scalar @all_items ) { + print $query->redirect("/cgi-bin/koha/errors/404.pl"); + exit; + } +} + +my $framework = &GetFrameworkCode( $biblionumber ); +my $tagslib = &GetMarcStructure( 0, $framework ); +my ($tag_itemnumber,$subtag_itemnumber) = &GetMarcFromKohaField('items.itemnumber',$framework); +my $biblio = GetBiblioData($biblionumber); + +my $record_processor = Koha::RecordProcessor->new({ + filters => 'ViewPolicy', + options => { + interface => 'opac', + frameworkcode => $framework + } +}); +$record_processor->process($record); + # 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,11 +111,28 @@ my ( $template, $loggedinuser, $cookie ) = get_template_and_user( } ); +my ($bt_tag,$bt_subtag) = GetMarcFromKohaField('biblio.title',$framework); $template->param( bibliotitle => $biblio->{title}, -); +) if $tagslib->{$bt_tag}->{$bt_subtag}->{hidden} <= 0 && # <=0 OPAC visible. + $tagslib->{$bt_tag}->{$bt_subtag}->{hidden} > -8; # except -8; + +# 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 ); + } +} -$template->param( 'AllowOnShelfHolds' => C4::Context->preference('AllowOnShelfHolds') ); +my $allow_onshelf_holds; +my $borrower = GetMember( 'borrowernumber' => $loggedinuser ); +for my $itm (@all_items) { + $allow_onshelf_holds = C4::Reserves::OnShelfHoldsAllowed($itm, $borrower); + last if $allow_onshelf_holds; +} + +$template->param( 'AllowOnShelfHolds' => $allow_onshelf_holds ); $template->param( 'ItemsIssued' => CountItemsIssued( $biblionumber ) ); # adding the $RequestOnOpac param @@ -141,12 +192,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 +239,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; @@ -206,84 +266,86 @@ for ( my $tabloop = 0 ; $tabloop <= 9 ; $tabloop++ ) { 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 ); + next if ( ( $field->tag() eq $tag_itemnumber ) && + ( any { $field->subfield($subtag_itemnumber) eq $_ } + @items2hide) ); 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}; 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 ); -} - -foreach my $subfield_code ( keys(%witness) ) { - my %header_value; - $header_value{header_value} = $witness{$subfield_code}; - push( @header_value_loop, \%header_value ); -} - -if(C4::Context->preference("ISBD")) { - $template->param(ISBD => 1); +if ( C4::Context->preference("OPACISBD") ) { + $template->param( ISBD => 1 ); } #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 (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); + $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); } $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, + biblionumber => $biblionumber, ); output_html_with_http_headers $query, $cookie, $template->output;