X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;f=C4%2FXSLT.pm;h=f434fa4fdc1f3212be5bb3b3e2851b0a6550e5a9;hb=9922d2bf40e2b7429f300d4d73134f9fef3b8c65;hp=dd13c501bcc90775ea7d9278b2ea5029cccd532e;hpb=017699c345725ea7012f1b84181dc053e20efd98;p=koha.git diff --git a/C4/XSLT.pm b/C4/XSLT.pm index dd13c501bc..f434fa4fdc 100644 --- a/C4/XSLT.pm +++ b/C4/XSLT.pm @@ -8,29 +8,29 @@ package C4::XSLT; # # 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 3 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 C4::Context; -use C4::Branch; use C4::Items; use C4::Koha; use C4::Biblio; use C4::Circulation; use C4::Reserves; +use Koha::AuthorisedValues; +use Koha::ItemTypes; use Koha::XSLT_Handler; use Koha::Libraries; @@ -68,13 +68,14 @@ Is only used in this module currently. sub transformMARCXML4XSLT { my ($biblionumber, $record) = @_; my $frameworkcode = GetFrameworkCode($biblionumber) || ''; - my $tagslib = &GetMarcStructure(1,$frameworkcode); + my $tagslib = &GetMarcStructure(1, $frameworkcode, { unsafe => 1 }); my @fields; # FIXME: wish there was a better way to handle exceptions eval { @fields = $record->fields(); }; if ($@) { warn "PROBLEM WITH RECORD"; next; } + my $marcflavour = C4::Context->preference('marcflavour'); my $av = getAuthorisedValues4MARCSubfields($frameworkcode); foreach my $tag ( keys %$av ) { foreach my $field ( $record->field( $tag ) ) { @@ -82,8 +83,11 @@ sub transformMARCXML4XSLT { my @new_subfields = (); for my $subfield ( $field->subfields() ) { my ( $letter, $value ) = @$subfield; - $value = GetAuthorisedValueDesc( $tag, $letter, $value, '', $tagslib ) - if $av->{ $tag }->{ $letter }; + # Replace the field value with the authorised value *except* for MARC21/NORMARC field 942$n (suppression in opac) + if ( !( $tag eq '942' && $subfield eq 'n' ) || $marcflavour eq 'UNIMARC' ) { + $value = GetAuthorisedValueDesc( $tag, $letter, $value, '', $tagslib ) + if $av->{ $tag }->{ $letter }; + } push( @new_subfields, $letter, $value ); } $field ->replace_with( MARC::Field->new( @@ -156,13 +160,43 @@ sub _get_best_default_xslt_filename { return $xslfilename; } +sub get_xslt_sysprefs { + my $sysxml = "\n"; + foreach my $syspref ( qw/ hidelostitems OPACURLOpenInNewWindow + DisplayOPACiconsXSLT URLLinkText viewISBD + OPACBaseURL TraceCompleteSubfields UseICU + UseAuthoritiesForTracings TraceSubjectSubdivisions + Display856uAsImage OPACDisplay856uAsImage + UseControlNumber IntranetBiblioDefaultView BiblioDefaultView + OPACItemLocation DisplayIconsXSLT + AlternateHoldingsField AlternateHoldingsSeparator + TrackClicks opacthemes IdRef OpacSuppression + OPACResultsLibrary / ) + { + my $sp = C4::Context->preference( $syspref ); + next unless defined($sp); + $sysxml .= "$sp\n"; + } + + # singleBranchMode was a system preference, but no longer is + # we can retain it here for compatibility + my $singleBranchMode = Koha::Libraries->search->count == 1 ? 1 : 0; + $sysxml .= "$singleBranchMode\n"; + + $sysxml .= "\n"; + return $sysxml; +} + sub XSLTParse4Display { - my ( $biblionumber, $orig_record, $xslsyspref, $fixamps, $hidden_items ) = @_; - my $xslfilename = C4::Context->preference($xslsyspref); + my ( $biblionumber, $orig_record, $xslsyspref, $fixamps, $hidden_items, $sysxml, $xslfilename, $lang ) = @_; + + $sysxml ||= C4::Context->preference($xslsyspref); + $xslfilename ||= C4::Context->preference($xslsyspref); + $lang ||= C4::Languages::getlanguage(); + if ( $xslfilename =~ /^\s*"?default"?\s*$/i ) { my $htdocs; my $theme; - my $lang = C4::Languages::getlanguage(); my $xslfile; if ($xslsyspref eq "XSLTDetailsDisplay") { $htdocs = C4::Context->config('intrahtdocs'); @@ -184,12 +218,23 @@ sub XSLTParse4Display { $theme = C4::Context->preference("opacthemes"); $xslfile = C4::Context->preference('marcflavour') . "slim2OPACResults.xsl"; + } elsif ($xslsyspref eq 'XSLTListsDisplay') { + # Lists default to *Results.xslt + $htdocs = C4::Context->config('intrahtdocs'); + $theme = C4::Context->preference("template"); + $xslfile = C4::Context->preference('marcflavour') . + "slim2intranetResults.xsl"; + } elsif ($xslsyspref eq 'OPACXSLTListsDisplay') { + # Lists default to *Results.xslt + $htdocs = C4::Context->config('opachtdocs'); + $theme = C4::Context->preference("opacthemes"); + $xslfile = C4::Context->preference('marcflavour') . + "slim2OPACResults.xsl"; } $xslfilename = _get_best_default_xslt_filename($htdocs, $theme, $lang, $xslfile); } if ( $xslfilename =~ m/\{langcode\}/ ) { - my $lang = C4::Languages::getlanguage(); $xslfilename =~ s/\{langcode\}/$lang/; } @@ -197,28 +242,7 @@ sub XSLTParse4Display { my $record = transformMARCXML4XSLT($biblionumber, $orig_record); my $itemsxml = buildKohaItemsNamespace($biblionumber, $hidden_items); my $xmlrecord = $record->as_xml(C4::Context->preference('marcflavour')); - my $sysxml = "\n"; - foreach my $syspref ( qw/ hidelostitems OPACURLOpenInNewWindow - DisplayOPACiconsXSLT URLLinkText viewISBD - OPACBaseURL TraceCompleteSubfields UseICU - UseAuthoritiesForTracings TraceSubjectSubdivisions - Display856uAsImage OPACDisplay856uAsImage - UseControlNumber IntranetBiblioDefaultView BiblioDefaultView - OPACItemLocation DisplayIconsXSLT - AlternateHoldingsField AlternateHoldingsSeparator - TrackClicks opacthemes IdRef / ) - { - my $sp = C4::Context->preference( $syspref ); - next unless defined($sp); - $sysxml .= "$sp\n"; - } - # singleBranchMode was a system preference, but no longer is - # we can retain it here for compatibility - my $singleBranchMode = Koha::Libraries->search->count == 1; - $sysxml .= "$singleBranchMode\n"; - - $sysxml .= "\n"; $xmlrecord =~ s/\<\/record\>/$itemsxml$sysxml\<\/record\>/; if ($fixamps) { # We need to correct the HTML entities that Zebra outputs $xmlrecord =~ s/\&amp;/\&/g; @@ -250,11 +274,14 @@ sub buildKohaItemsNamespace { @items = grep { !$hi{$_->{itemnumber}} } @items; } - my $shelflocations = GetKohaAuthorisedValues('items.location',GetFrameworkCode($biblionumber), 'opac'); - my $ccodes = GetKohaAuthorisedValues('items.ccode',GetFrameworkCode($biblionumber), 'opac'); + my $shelflocations = + { map { $_->{authorised_value} => $_->{opac_description} } Koha::AuthorisedValues->get_descriptions_by_koha_field( { frameworkcode => GetFrameworkCode($biblionumber), kohafield => 'items.location' } ) }; + my $ccodes = + { map { $_->{authorised_value} => $_->{opac_description} } Koha::AuthorisedValues->get_descriptions_by_koha_field( { frameworkcode => GetFrameworkCode($biblionumber), kohafield => 'items.ccode' } ) }; + + my %branches = map { $_->branchcode => $_->branchname } Koha::Libraries->search({}, { order_by => 'branchname' }); - my $branches = GetBranches(); - my $itemtypes = GetItemTypes(); + my $itemtypes = { map { $_->{itemtype} => $_ } @{ Koha::ItemTypes->search->unblessed } }; my $location = ""; my $ccode = ""; my $xml = ''; @@ -265,12 +292,12 @@ sub buildKohaItemsNamespace { my $reservestatus = C4::Reserves::GetReserveStatus( $item->{itemnumber} ); - if ( $itemtypes->{ $item->{itype} }->{notforloan} || $item->{notforloan} || $item->{onloan} || $item->{withdrawn} || $item->{itemlost} || $item->{damaged} || + if ( ( $item->{itype} && $itemtypes->{ $item->{itype} }->{notforloan} ) || $item->{notforloan} || $item->{onloan} || $item->{withdrawn} || $item->{itemlost} || $item->{damaged} || (defined $transfertwhen && $transfertwhen ne '') || $item->{itemnotforloan} || (defined $reservestatus && $reservestatus eq "Waiting") ){ if ( $item->{notforloan} < 0) { $status = "On order"; } - if ( $item->{itemnotforloan} > 0 || $item->{notforloan} > 0 || $itemtypes->{ $item->{itype} }->{notforloan} == 1 ) { + if ( $item->{itemnotforloan} && $item->{itemnotforloan} > 0 || $item->{notforloan} && $item->{notforloan} > 0 || $item->{itype} && $itemtypes->{ $item->{itype} }->{notforloan} && $itemtypes->{ $item->{itype} }->{notforloan} == 1 ) { $status = "reference"; } if ($item->{onloan}) { @@ -283,7 +310,7 @@ sub buildKohaItemsNamespace { $status = "Lost"; } if ($item->{damaged}) { - $status = "Damaged"; + $status = "Damaged"; } if (defined $transfertwhen && $transfertwhen ne '') { $status = 'In transit'; @@ -294,18 +321,22 @@ sub buildKohaItemsNamespace { } else { $status = "available"; } - my $homebranch = $item->{homebranch}? xml_escape($branches->{$item->{homebranch}}->{'branchname'}):''; - my $holdingbranch = $item->{holdingbranch}? xml_escape($branches->{$item->{holdingbranch}}->{'branchname'}):''; + my $homebranch = $item->{homebranch}? xml_escape($branches{$item->{homebranch}}):''; + my $holdingbranch = $item->{holdingbranch}? xml_escape($branches{$item->{holdingbranch}}):''; $location = $item->{location}? xml_escape($shelflocations->{$item->{location}}||$item->{location}):''; $ccode = $item->{ccode}? xml_escape($ccodes->{$item->{ccode}}||$item->{ccode}):''; my $itemcallnumber = xml_escape($item->{itemcallnumber}); - $xml.= "$homebranch". - "$holdingbranch". - "$location". - "$ccode". - "$status". - "".$itemcallnumber."". - ""; + my $stocknumber = $item->{stocknumber}? xml_escape($item->{stocknumber}):''; + $xml .= + "" + . "$homebranch" + . "$holdingbranch" + . "$location" + . "$ccode" + . "".( $status // q{} )."" + . "$itemcallnumber" + . "$stocknumber" + . ""; } $xml = "".$xml.""; return $xml;