@@ -, +, @@ --- C4/Biblio.pm | 63 ++++++++++++++++++++++++++++++++++++++++++++++++- C4/XSLT.pm | 1 - opac/opac-detail.pl | 25 ++++---------------- opac/opac-showmarc.pl | 6 +++++ 4 files changed, 73 insertions(+), 22 deletions(-) --- a/C4/Biblio.pm +++ a/C4/Biblio.pm @@ -80,6 +80,7 @@ BEGIN { &GetMarcHosts GetMarcUrls &GetOpacHideMARC + &GetFilteredOpacBiblio &GetUsedMarcStructure &GetXmlBiblio &GetCOinSBiblio @@ -1230,7 +1231,7 @@ C<$frameworkcode> is the framework code. sub GetOpacHideMARC { my ( $frameworkcode ) = shift || ''; my $dbh = C4::Context->dbh; - my $sth = $dbh->prepare("select substring(kohafield,locate('.',kohafield)+1,40) as field,tagfield as tag,hidden from marc_subfield_structure where length(trim(kohafield))>0 and frameworkcode=? order by field,tagfield;"); + my $sth = $dbh->prepare("SELECT SUBSTRING(kohafield,LOCATE('.',kohafield)+1,40) AS field,tagfield AS tag,hidden FROM marc_subfield_structure WHERE LENGTH(TRIM(kohafield))>0 AND frameworkcode=? ORDER BY field,tagfield;"); my $rv = $sth->execute($frameworkcode); my %opachidemarc; my $data = $sth->fetchall_hashref( [ qw(field tag) ] ); @@ -1247,6 +1248,66 @@ sub GetOpacHideMARC { return \%opachidemarc; } +=head2 GetFilteredOpacBiblio + +Return a MARC::Record which has been filtered based +on the corresponding marc_subfield_structure records +for the given framework by excluding hidden>0. + + my $filtered_record = GetFilteredOpacBiblio($record,$frameworkcode); + +C<$record> is a MARC::Record. + +C<$frameworkcode> is the framework code. + +=cut + +sub GetFilteredOpacBiblio { + my ( $record ) = shift; + if (!$record) { return $record; } + + my ( $frameworkcode ) = shift || ''; + + my $marcsubfieldstructure = GetMarcStructure(0,$frameworkcode); + if ($marcsubfieldstructure->{'000'}->{'@'}->{hidden}>0) { + # LDR field is excluded from $record->fields(). + # if we hide it here, the MARCXML->MARC::Record->MARCXML transformation blows up. + print STDERR "Supposed to hide LEADER\n"; + } + foreach my $fields ($record->fields()) { + my $tag = $fields->tag(); + if ($tag>=10) { + foreach my $subpairs ($fields->subfields()) { + my ($subtag,$value) = @$subpairs; + my $hidden = $marcsubfieldstructure->{$tag}->{$subtag}->{hidden}; + $hidden //= 0; + $hidden = ($hidden<=0) ? 0 : 1; + if ($hidden) { + # deleting last subfield doesn't delete field, so + # this detects that case to delete the field. + if (scalar $fields->subfields() <= 1) { + $record->delete_fields($fields); + } + else { + $fields->delete_subfield( code => $subtag ); + } + } + } + } + # tags less than 10 don't have subfields, use @ trick. + else { + my $hidden = $marcsubfieldstructure->{$tag}->{'@'}->{hidden}; + $hidden //= 0; + $hidden = ($hidden<=0) ? 0 : 1; + if ($hidden) { + $record->delete_fields($fields); + } + } + } + + return $record; +} + =head2 GetMarcFromKohaField ($MARCfield,$MARCsubfield)=GetMarcFromKohaField($kohafield,$frameworkcode); --- a/C4/XSLT.pm +++ a/C4/XSLT.pm @@ -84,7 +84,6 @@ sub transformMARCXML4XSLT { if ($@) { warn "PROBLEM WITH RECORD"; next; } my $av = getAuthorisedValues4MARCSubfields($frameworkcode); foreach my $tag ( keys %$av ) { - print STDERR "TAG: $tag\n"; foreach my $field ( $record->field( $tag ) ) { if ( $av->{ $tag } ) { my @new_subfields = (); --- a/opac/opac-detail.pl +++ a/opac/opac-detail.pl @@ -51,7 +51,6 @@ use C4::Images; use Koha::DateUtils; use C4::HTML5Media; use C4::CourseReserves qw(GetItemCourseReservesInfo); -use Data::Dumper; BEGIN { if (C4::Context->preference('BakerTaylorEnabled')) { @@ -94,24 +93,7 @@ $template->param( biblionumber => $biblionumber ); # Filter out the things to hide in OPAC. my $frameworkcode = GetFrameworkCode($biblionumber); -my $marcsubfieldstructure = GetMarcStructure(0,$frameworkcode); -foreach my $fields ($record->fields()) { - my $tag = $fields->tag(); - foreach my $subpairs ($fields->subfields()) { - my ($subtag,$value) = @$subpairs; - my $hidden = $marcsubfieldstructure->{$tag}->{$subtag}->{hidden}; - $hidden //= 0; - $hidden = ($hidden<=0) ? 0 : 1; - if ($hidden) { - if (scalar $fields->subfields() == 1) { - $record->delete_fields($fields); - } - else { - $fields->delete_subfield( code => $subtag ); - } - } - } -} +#$record = GetFilteredOpacBiblio($record,$frameworkcode); # get biblionumbers stored in the cart my @cart_list; @@ -675,7 +657,10 @@ if ($st_tag && $st_subtag) { my @subtitles = $record->subfield($st_tag,$st_subtag); $subtitle = \@subtitles if scalar @subtitles; } -print STDERR Dumper($subtitle); +if (scalar @$subtitle) { + my @subtitles = map { { subfield => $_ } } @$subtitle; + $subtitle = \@subtitles; +} $template->param( MARCNOTES => $marcnotesarray, --- a/opac/opac-showmarc.pl +++ a/opac/opac-showmarc.pl @@ -57,6 +57,12 @@ else { if ($view eq 'card' || $view eq 'html') { my $xmlrecord= $importid? $record->as_xml(): GetXmlBiblio($biblionumber); + if (!$importid && $view eq 'html') { + my $filtered_record = MARC::Record->new_from_xml($xmlrecord); + my $frameworkcode = GetFrameworkCode($biblionumber); + $filtered_record = GetFilteredOpacBiblio($filtered_record,$frameworkcode); + $xmlrecord = $filtered_record->as_xml(); + } my $xslfile; my $xslfilename; my $htdocs = C4::Context->config('opachtdocs'); --