File: | C4/Heading.pm |
Coverage: | 26.4% |
line | stmt | bran | cond | sub | time | code |
---|---|---|---|---|---|---|
1 | package C4::Heading; | |||||
2 | ||||||
3 | # Copyright (C) 2008 LibLime | |||||
4 | # | |||||
5 | # This file is part of Koha. | |||||
6 | # | |||||
7 | # Koha is free software; you can redistribute it and/or modify it under the | |||||
8 | # terms of the GNU General Public License as published by the Free Software | |||||
9 | # Foundation; either version 2 of the License, or (at your option) any later | |||||
10 | # version. | |||||
11 | # | |||||
12 | # Koha is distributed in the hope that it will be useful, but WITHOUT ANY | |||||
13 | # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR | |||||
14 | # A PARTICULAR PURPOSE. See the GNU General Public License for more details. | |||||
15 | # | |||||
16 | # You should have received a copy of the GNU General Public License along | |||||
17 | # with Koha; if not, write to the Free Software Foundation, Inc., | |||||
18 | # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | |||||
19 | ||||||
20 | 3 3 3 | 23189 7 82 | use strict; | |||
21 | #use warnings; FIXME - Bug 2505 | |||||
22 | 3 3 3 | 261 9766 130 | use MARC::Record; | |||
23 | 3 3 3 | 13 22 96 | use MARC::Field; | |||
24 | 3 3 3 | 236 27 70 | use C4::Context; | |||
25 | 3 3 3 | 1173 10 98 | use C4::Heading::MARC21; | |||
26 | 3 3 3 | 21 8 1939 | use Carp; | |||
27 | ||||||
28 | our $VERSION = 3.00; | |||||
29 | ||||||
30 - 64 | =head1 NAME C4::Heading =head1 SYNOPSIS use C4::Heading; my $heading = C4::Heading->new_from_bib_field($field); my $thesaurus = $heading->thesaurus(); my $type = $heading->type(); my $display_heading = $heading->display(); my $search_string = $heading->search_string(); =head1 DESCRIPTION C<C4::Heading> implements a simple class to representing headings found in bibliographic and authority records. =head1 METHODS =head2 new_from_bib_field my $heading = C4::Heading->new_from_bib_field($field[, $marc_flavour]); Given a C<MARC::Field> object containing a heading from a bib record, create a C<C4::Heading> object. The optional second parameter is the MARC flavour (i.e., MARC21 or UNIMARC); if this parameter is not supplied, it is taken from the Koha application context. If the MARC field supplied is not a valid heading, undef is returned. =cut | |||||
65 | ||||||
66 | sub new_from_bib_field { | |||||
67 | 0 | my $class = shift; | ||||
68 | 0 | my $field = shift; | ||||
69 | 0 | my $marcflavour = @_ ? shift : C4::Context->preference('marcflavour'); | ||||
70 | ||||||
71 | 0 | my $marc_handler = _marc_format_handler($marcflavour); | ||||
72 | ||||||
73 | 0 | my $tag = $field->tag(); | ||||
74 | 0 | return unless $marc_handler->valid_bib_heading_tag($tag); | ||||
75 | 0 | my $self = {}; | ||||
76 | ||||||
77 | 0 | ($self->{'auth_type'}, $self->{'subject_added_entry'}, $self->{'series_added_entry'}, $self->{'main_entry'}, | ||||
78 | $self->{'thesaurus'}, $self->{'search_form'}, $self->{'display_form'}) = | |||||
79 | $marc_handler->parse_heading($field); | |||||
80 | ||||||
81 | 0 | bless $self, $class; | ||||
82 | 0 | return $self; | ||||
83 | } | |||||
84 | ||||||
85 - 91 | =head2 display_form my $display = $heading->display_form(); Return the "canonical" display form of the heading. =cut | |||||
92 | ||||||
93 | sub display_form { | |||||
94 | 0 | my $self = shift; | ||||
95 | 0 | return $self->{'display_form'}; | ||||
96 | } | |||||
97 | ||||||
98 - 105 | =head2 authorities my $authorities = $heading->authorities; Return a list of authority records for this heading. =cut | |||||
106 | ||||||
107 | sub authorities { | |||||
108 | 0 | my $self = shift; | ||||
109 | 0 | my $query = qq(Match-heading,do-not-truncate,ext="$self->{'search_form'}"); | ||||
110 | 0 | $query .= $self->_query_limiters(); | ||||
111 | 0 | require C4::Search; | ||||
112 | 0 | my ($error, $results, $total_hits) = C4::Search::SimpleSearch( $query, undef, undef, [ "authorityserver" ] ); | ||||
113 | 0 | if (defined $error) { | ||||
114 | 0 | carp "Error:$error from search $query"; | ||||
115 | } | |||||
116 | 0 | return $results; | ||||
117 | } | |||||
118 | ||||||
119 - 126 | =head2 preferred_authorities my $preferred_authorities = $heading->preferred_authorities; Return a list of authority records for headings that are a preferred form of the heading. =cut | |||||
127 | ||||||
128 | sub preferred_authorities { | |||||
129 | 0 | my $self = shift; | ||||
130 | 0 | my $query = "Match-heading-see-from,do-not-truncate,ext='$self->{'search_form'}'"; | ||||
131 | 0 | $query .= $self->_query_limiters(); | ||||
132 | 0 | require C4::Search; | ||||
133 | 0 | my ($error, $results, $total_hits) = C4::Search::SimpleSearch( $query, undef, undef, [ "authorityserver" ] ); | ||||
134 | 0 | if (defined $error) { | ||||
135 | 0 | carp "Error:$error from search $query"; | ||||
136 | } | |||||
137 | 0 | return $results; | ||||
138 | } | |||||
139 | ||||||
140 - 144 | =head1 INTERNAL METHODS =head2 _query_limiters =cut | |||||
145 | ||||||
146 | sub _query_limiters { | |||||
147 | 0 | my $self = shift; | ||||
148 | ||||||
149 | 0 | my $limiters = " AND at='$self->{'auth_type'}'"; | ||||
150 | 0 | if ($self->{'subject_added_entry'}) { | ||||
151 | 0 | $limiters .= " AND Heading-use-subject-added-entry=a"; # FIXME -- is this properly in C4::Heading::MARC21? | ||||
152 | 0 | $limiters .= " AND Subject-heading-thesaurus=$self->{'thesaurus'}"; | ||||
153 | } | |||||
154 | 0 | if ($self->{'series_added_entry'}) { | ||||
155 | 0 | $limiters .= " AND Heading-use-series-added-entry=a"; # FIXME -- is this properly in C4::Heading::MARC21? | ||||
156 | } | |||||
157 | 0 | if (not $self->{'subject_added_entry'} and not $self->{'series_added_entry'}) { | ||||
158 | 0 | $limiters .= " AND Heading-use-main-or-added-entry=a" # FIXME -- is this properly in C4::Heading::MARC21? | ||||
159 | } | |||||
160 | 0 | return $limiters; | ||||
161 | } | |||||
162 | ||||||
163 - 170 | =head1 INTERNAL FUNCTIONS =head2 _marc_format_handler Returns a C4::Heading::MARC21 or C4::Heading::UNIMARC object depending on the selected MARC flavour. =cut | |||||
171 | ||||||
172 | sub _marc_format_handler { | |||||
173 | 0 | my $marcflavour = shift; | ||||
174 | ||||||
175 | 0 | if ($marcflavour eq 'UNIMARC') { | ||||
176 | 0 | return C4::Heading::UNIMARC->new(); | ||||
177 | } else { | |||||
178 | 0 | return C4::Heading::MARC21->new(); | ||||
179 | } | |||||
180 | ||||||
181 | } | |||||
182 | ||||||
183 - 189 | =head1 AUTHOR Koha Development Team <http://koha-community.org/> Galen Charlton <galen.charlton@liblime.com> =cut | |||||
190 | ||||||
191 | 1; |