1 package Koha
::Filter
::MARC
::ViewPolicy
;
3 # Copyright 2015 Mark Tompsett
5 # This file is part of Koha.
7 # Koha is free software; you can redistribute it and/or modify it
8 # under the terms of the GNU General Public License as published by
9 # the Free Software Foundation; either version 3 of the License, or
10 # (at your option) any later version.
12 # Koha is distributed in the hope that it will be useful, but
13 # WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
17 # You should have received a copy of the GNU General Public License
18 # along with Koha; if not, see <http://www.gnu.org/licenses>.
22 Koha::Filter::MARC::ViewPolicy - this filters a MARC record.
30 my $processor = Koha::RecordProcessor->new( { filters => ('ViewPolicy') } );
34 Filter to remove fields based on the 'Advance constraints'
35 settings found when editing a particular subfield definition of
36 a MARC bibliographic framework found under the Koha administration
45 use base
qw(Koha::RecordProcessor::Base);
46 our $NAME = 'MARC_ViewPolicy';
47 our $VERSION = '3.23'; # Master version I hope it gets in.
49 use constant FIRST_NONCONTROL_TAG
=> 10; # tags < 10 are control tags.
51 =head1 SUBROUTINES/METHODS
55 my $processor = Koha::RecordProcessor->new( { filters => ('ViewPolicy') } );
57 my $newrecord = $processor->filter($record);
58 my $newrecords = $processor->filter(\@records);
60 This returns a filtered copy of the record based on the Advanced constraints
74 if ( ref($precord) eq 'ARRAY' ) {
75 @records = @
{$precord};
78 push @records, $precord;
81 my $params = $self->params;
82 my $interface = $params->{options
}->{interface
} // 'opac';
83 my $frameworkcode = $params->{options
}->{frameworkcode
} // q{};
85 foreach my $current_record (@records) {
86 my $result = $current_record;
87 my $hide = _should_hide_on_interface
();
89 my $marcsubfieldstructure = GetMarcStructure
( 0, $frameworkcode, { unsafe
=> 1 } );
91 #if ($marcsubfieldstructure->{'000'}->{'@'}->{hidden}>0) {
92 # LDR field is excluded from $current_record->fields().
93 # if we hide it here, the MARCXML->MARC::Record->MARCXML
94 # transformation blows up.
96 foreach my $field ( $result->fields() ) {
100 marcsubfieldstructure
=> $marcsubfieldstructure,
102 interface
=> $interface,
112 my ($parameter) = @_;
114 my $field = $parameter->{field
};
115 my $marcsubfieldstructure = $parameter->{marcsubfieldstructure
};
116 my $hide = $parameter->{hide
};
117 my $interface = $parameter->{interface
};
118 my $result = $parameter->{result
};
120 my $tag = $field->tag();
121 if ( $tag >= FIRST_NONCONTROL_TAG
) {
122 foreach my $subpairs ( $field->subfields() ) {
123 my ( $subtag, $value ) = @
{$subpairs};
125 # visibility is a "level" (-9 to +9), default to 0
126 # -8 is flagged, and 9/-9 are not implemented.
128 $marcsubfieldstructure->{$tag}->{$subtag}->{hidden
};
130 if ( $hide->{$interface}->{$visibility} ) {
132 # deleting last subfield doesn't delete field, so
133 # this detects that case to delete the field.
134 if ( scalar $field->subfields() <= 1 ) {
135 $result->delete_fields($field);
138 $field->delete_subfield( code
=> $subtag );
144 # control tags don't have subfields, use @ trick.
146 # visibility is a "level" (-9 to +9), default to 0
147 # -8 is flagged, and 9/-9 are not implemented.
148 my $visibility = $marcsubfieldstructure->{$tag}->{q{@}}->{hidden
};
150 if ( $hide->{$interface}->{$visibility} ) {
151 $result->delete_fields($field);
158 # Copied and modified from 3.10.x help file
159 # marc_subfields_structure.hidden
160 # allows you to select from 19 possible visibility conditions, 17 of which are implemented. They are the following:
163 # -7 => OPAC !Intranet !Editor Collapsed
164 # -6 => OPAC Intranet !Editor !Collapsed
165 # -5 => OPAC Intranet !Editor Collapsed
166 # -4 => OPAC !Intranet !Editor !Collapsed
167 # -3 => OPAC !Intranet Editor Collapsed
168 # -2 => OPAC !Intranet Editor !Collapsed
169 # -1 => OPAC Intranet Editor Collapsed
170 # 0 => OPAC Intranet Editor !Collapsed
171 # 1 => !OPAC Intranet Editor Collapsed
172 # 2 => !OPAC !Intranet Editor !Collapsed
173 # 3 => !OPAC !Intranet Editor Collapsed
174 # 4 => !OPAC Intranet Editor !Collapsed
175 # 5 => !OPAC !Intranet !Editor Collapsed
176 # 6 => !OPAC Intranet !Editor !Collapsed
177 # 7 => !OPAC Intranet !Editor Collapsed
178 # 8 => !OPAC !Intranet !Editor !Collapsed
180 # ( ! means 'not visible' or in the case of Collapsed 'not Collapsed')
182 sub _should_hide_on_interface
{
210 =head2 should_hide_marc
212 Return a hash reference of whether a field, built from
213 kohafield and tag, is hidden (1) or not (0) for a given
218 frameworkcode => $frameworkcode,
222 if ($OpacHideMARC->{'stocknumber'}==1) {
226 C<$OpacHideMARC> is a ref to a hash which contains a series
227 of key value pairs indicating if that field (key) is
228 hidden (value == 1) or not (value == 0).
230 C<$frameworkcode> is the framework code.
232 C<$interface> is the interface. It defaults to 'opac' if
233 nothing is passed. Valid values include 'opac' or 'intranet'.
237 sub should_hide_marc
{
238 my ( $self, $parms ) = @_;
239 my $frameworkcode = $parms->{frameworkcode
} // q{};
240 my $interface = $parms->{interface
} // 'opac';
241 my $hide = _should_hide_on_interface
();
244 my $marc_subfield_structure = GetMarcStructure
( 0, $frameworkcode );
245 foreach my $tag ( keys %{$marc_subfield_structure} ) {
246 foreach my $subtag ( keys %{ $marc_subfield_structure->{$tag} } ) {
247 my $subfield_record = $marc_subfield_structure->{$tag}->{$subtag};
248 if ( ref $subfield_record eq 'HASH' ) {
249 my $kohafield = $subfield_record->{'kohafield'};
251 my @tmpsplit = split /[.]/xsm, $kohafield;
252 my $field = $tmpsplit[-1];
253 my $hidden = $subfield_record->{'hidden'};
254 my $shouldhide = $hide->{$interface}->{$hidden};
256 $shouldhidemarc{$field} = 1;
258 elsif ( !exists $shouldhidemarc{$field} ) {
259 $shouldhidemarc{$field} = 0;
266 return \
%shouldhidemarc;
271 $ prove -v t/RecordProcessor.t
272 $ prove -v t/db_dependent/Filter_MARC_ViewPolicy.t
274 =head1 CONFIGURATION AND ENVIRONMENT
276 Install Koha. This filter will be used appropriately by the OPAC or staff interface.
278 =head1 INCOMPATIBILITIES
280 This is designed for MARC::Record filtering currently. It will not handle MARC::MARCXML.
284 The following Perl libraries are required: Modern::Perl and Carp.
285 The following Koha libraries are required: C4::Biblio, Koha::RecordProcessor, and Koha::RecordProcessor::Base.
286 These should all be installed if the koha-common package is installed or Koha is otherwise installed.
288 =head1 BUGS AND LIMITATIONS
290 This is the initial version. Please feel free to report bugs
291 at http://bugs.koha-community.org/.
297 =head1 LICENSE AND COPYRIGHT
299 Copyright 2015 Mark Tompsett
301 This file is part of Koha.
303 Koha is free software; you can redistribute it and/or modify it
304 under the terms of the GNU General Public License as published by
305 the Free Software Foundation; either version 3 of the License, or
306 (at your option) any later version.
308 Koha is distributed in the hope that it will be useful, but
309 WITHOUT ANY WARRANTY; without even the implied warranty of
310 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
311 GNU General Public License for more details.
313 You should have received a copy of the GNU General Public License
314 along with Koha; if not, see <http://www.gnu.org/licenses>.