# use warnings; # FIXME
require Exporter;
use C4::Context;
-use C4::Biblio; # GetMarcFromKohaField
+use C4::Biblio; # GetMarcFromKohaField, GetBiblioData
use C4::Koha; # getFacets
use Lingua::Stem;
use C4::Search::PazPar2;
use C4::Dates qw(format_date);
use C4::XSLT;
use C4::Branch;
+use URI::Escape;
use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS $DEBUG);
@ISA = qw(Exporter);
@EXPORT = qw(
- &findseealso
&FindDuplicate
&SimpleSearch
&searchResults
# make all your functions, whether exported or not;
-=head2 findseealso($dbh,$fields);
-
-C<$dbh> is a link to the DB handler.
-
-use C4::Context;
-my $dbh =C4::Context->dbh;
-
-C<$fields> is a reference to the fields array
-
-This function modifies the @$fields array and adds related fields to search on.
-
-FIXME: this function is probably deprecated in Koha 3
-
-=cut
-
-sub findseealso {
- my ( $dbh, $fields ) = @_;
- my $tagslib = GetMarcStructure(1);
- for ( my $i = 0 ; $i <= $#{$fields} ; $i++ ) {
- my ($tag) = substr( @$fields[$i], 1, 3 );
- my ($subfield) = substr( @$fields[$i], 4, 1 );
- @$fields[$i] .= ',' . $tagslib->{$tag}->{$subfield}->{seealso}
- if ( $tagslib->{$tag}->{$subfield}->{seealso} );
- }
-}
-
=head2 FindDuplicate
($biblionumber,$biblionumber,$title) = FindDuplicate($record);
# if it's a branch, label by the name, not the code,
if ( $link_value =~ /branch/ ) {
- $facet_label_value =
- $branches->{$one_facet}->{'branchname'};
+ if (defined $branches
+ && ref($branches) eq "HASH"
+ && defined $branches->{$one_facet}
+ && ref ($branches->{$one_facet}) eq "HASH")
+ {
+ $facet_label_value =
+ $branches->{$one_facet}->{'branchname'};
+ }
+ else {
+ $facet_label_value = "*";
+ }
}
# but we're down with the whole label being in the link's title.
# Date of Publication
if ( $index eq 'yr' ) {
$index .= ",st-numeric";
- $indexes_set++;
+# $indexes_set++;
$stemming = $auto_truncation = $weight_fields = $fuzzy_enabled = $remove_stopwords = 0;
}
# Date of Acquisition
elsif ( $index eq 'acqdate' ) {
$index .= ",st-date-normalized";
- $indexes_set++;
+# $indexes_set++;
$stemming = $auto_truncation = $weight_fields = $fuzzy_enabled = $remove_stopwords = 0;
}
# ISBN,ISSN,Standard Number, don't need special treatment
elsif ( $index eq 'nb' || $index eq 'ns' ) {
- $indexes_set++;
+# $indexes_set++;
(
$stemming, $auto_truncation,
$weight_fields, $fuzzy_enabled,
# Regular old limits
else {
- $limit .= " and " if $limit || $query;
- $limit .= "$this_limit";
- $limit_cgi .= "&limit=$this_limit";
- if ($this_limit =~ /^branch:(.+)/) {
- my $branchcode = $1;
- my $branchname = GetBranchName($branchcode);
- if (defined $branchname) {
- $limit_desc .= " branch:$branchname";
+ if ($this_limit){
+ $limit .= " and " if $limit || $query;
+ $limit .= "$this_limit";
+ $limit_cgi .= "&limit=$this_limit";
+ $limit_desc .= " $this_limit";
+ if ($this_limit =~ /^branch:(.+)/) {
+ my $branchcode = $1;
+ my $branchname = GetBranchName($branchcode);
+ if (defined $branchname) {
+ $limit_desc .= " branch:$branchname";
+ } else {
+ $limit_desc .= " $this_limit";
+ }
} else {
- $limit_desc .= " $this_limit";
+ $limit_desc .= " $this_limit";
}
- } else {
- $limit_desc .= " $this_limit";
- }
+
+ }
}
}
if ($group_OR_limits) {
$oldbiblio->{normalized_oclc} = GetNormalizedOCLCNumber($marcrecord,$marcflavour);
$oldbiblio->{normalized_isbn} = GetNormalizedISBN(undef,$marcrecord,$marcflavour);
$oldbiblio->{content_identifier_exists} = 1 if ($oldbiblio->{normalized_isbn} or $oldbiblio->{normalized_oclc} or $oldbiblio->{normalized_ean} or $oldbiblio->{normalized_upc});
+
+ # edition information, if any
+ $oldbiblio->{edition} = $oldbiblio->{editionstatement};
$oldbiblio->{description} = $itemtypes{ $oldbiblio->{itemtype} }->{description};
# Build summary if there is one (the summary is defined in the itemtypes table)
# FIXME: is this used anywhere, I think it can be commented out? -- JF
foreach my $field (@fields) {
my $tag = $field->tag();
my $tagvalue = $field->as_string();
+ if (! utf8::is_utf8($tagvalue)) {
+ utf8::decode($tagvalue);
+ }
+
$summary =~
s/\[(.?.?.?.?)$tag\*(.*?)]/$1$tagvalue$2\[$1$tag$2]/g;
unless ( $tag < 10 ) {
for my $i ( 0 .. $#subf ) {
my $subfieldcode = $subf[$i][0];
my $subfieldvalue = $subf[$i][1];
+ if (! utf8::is_utf8($subfieldvalue)) {
+ utf8::decode($subfieldvalue);
+ }
my $tagsubf = $tag . $subfieldcode;
$summary =~
s/\[(.?.?.?.?)$tagsubf(.*?)]/$1$subfieldvalue$2\[$1$tagsubf$2]/g;
# Setting item statuses for display
my @available_items_loop;
my @onloan_items_loop;
+ my @notforloan_items_loop;
my @other_items_loop;
my $available_items;
my $onloan_items;
+ my $notforloan_items;
my $other_items;
my $ordered_count = 0;
my $available_count = 0;
my $onloan_count = 0;
+ my $notforloan_count = 0;
my $longoverdue_count = 0;
my $other_count = 0;
my $wthdrawn_count = 0;
$onloan_items->{$key}->{location} = $shelflocations->{ $item->{location} };
$onloan_items->{$key}->{itemcallnumber} = $item->{itemcallnumber};
$onloan_items->{$key}->{imageurl} = getitemtypeimagelocation( 'opac', $itemtypes{ $item->{itype} }->{imageurl} );
+ $onloan_items->{$key}->{barcode} = $item->{barcode};
# if something's checked out and lost, mark it as 'long overdue'
if ( $item->{itemlost} ) {
$onloan_items->{$prefix}->{longoverdue}++;
$other_count++;
my $key = $prefix . $item->{status};
+
foreach (qw(wthdrawn itemlost damaged branchname itemcallnumber)) {
$other_items->{$key}->{$_} = $item->{$_};
}
$can_place_holds = 1;
$available_count++;
$available_items->{$prefix}->{count}++ if $item->{$hbranch};
- foreach (qw(branchname itemcallnumber)) {
+ foreach (qw(branchname itemcallnumber barcode)) {
$available_items->{$prefix}->{$_} = $item->{$_};
}
$available_items->{$prefix}->{location} = $shelflocations->{ $item->{location} };
}
}
} # notforloan, item level and biblioitem level
- my ( $availableitemscount, $onloanitemscount, $otheritemscount );
+ my ( $availableitemscount, $onloanitemscount, $notforloanitemscount,$otheritemscount );
$maxitems =
( C4::Context->preference('maxItemsinSearchResults') )
? C4::Context->preference('maxItemsinSearchResults') - 1
(++$otheritemscount > $maxitems) and last;
push @other_items_loop, $other_items->{$key};
}
+ for my $key ( sort keys %$notforloan_items ) {
+ (++$notforloanitemscount > $maxitems) and last;
+ push @notforloan_items_loop, $notforloan_items->{$key};
+ }
for my $key ( sort keys %$available_items ) {
(++$availableitemscount > $maxitems) and last;
push @available_items_loop, $available_items->{$key}
}
# last check for norequest : if itemtype is notforloan, it can't be reserved either, whatever the items
- $can_place_holds = 0
- if $itemtypes{ $oldbiblio->{itemtype} }->{notforloan};
+ $can_place_holds = 0 if $itemtypes{ $oldbiblio->{itemtype} }->{notforloan};
$oldbiblio->{norequests} = 1 unless $can_place_holds;
$oldbiblio->{itemsplural} = 1 if $items_count > 1;
$oldbiblio->{items_count} = $items_count;
$oldbiblio->{available_items_loop} = \@available_items_loop;
+ $oldbiblio->{notforloan_items_loop}= \@notforloan_items_loop;
$oldbiblio->{onloan_items_loop} = \@onloan_items_loop;
$oldbiblio->{other_items_loop} = \@other_items_loop;
$oldbiblio->{availablecount} = $available_count;
$oldbiblio->{availableplural} = 1 if $available_count > 1;
$oldbiblio->{onloancount} = $onloan_count;
$oldbiblio->{onloanplural} = 1 if $onloan_count > 1;
+ $oldbiblio->{notforloancount} = $notforloan_count;
$oldbiblio->{othercount} = $other_count;
$oldbiblio->{otherplural} = 1 if $other_count > 1;
$oldbiblio->{wthdrawncount} = $wthdrawn_count;
unless $callnumber_tag;
if ( C4::Context->preference('marcflavour') eq 'UNIMARC' ) {
$callnumber = $record->subfield( '200', 'f' );
- } else {
+ }
+ else {
$callnumber = $record->subfield( '100', 'a' );
}
}
}
+=head2 enabled_staff_search_views
+
+%hash = enabled_staff_search_views()
+
+This function returns a hash that contains three flags obtained from the system
+preferences, used to determine whether a particular staff search results view
+is enabled.
+
+=over 2
+
+=item C<Output arg:>
+
+ * $hash{can_view_MARC} is true only if the MARC view is enabled
+ * $hash{can_view_ISBD} is true only if the ISBD view is enabled
+ * $hash{can_view_labeledMARC} is true only if the Labeled MARC view is enabled
+
+=item C<usage in the script:>
+
+=back
+
+$template->param ( C4::Search::enabled_staff_search_views );
+
+=cut
+
+sub enabled_staff_search_views
+{
+ return (
+ can_view_MARC => C4::Context->preference('viewMARC'), # 1 if the staff search allows the MARC view
+ can_view_ISBD => C4::Context->preference('viewISBD'), # 1 if the staff search allows the ISBD view
+ can_view_labeledMARC => C4::Context->preference('viewLabeledMARC'), # 1 if the staff search allows the Labeled MARC view
+ );
+}
+
+
+=head2 z3950_search_args
+
+$arrayref = z3950_search_args($matchpoints)
+
+This function returns an array reference that contains the search parameters to be
+passed to the Z39.50 search script (z3950_search.pl). The array elements
+are hash refs whose keys are name, value and encvalue, and whose values are the
+name of a search parameter, the value of that search parameter and the URL encoded
+value of that parameter.
+
+The search parameter names are lccn, isbn, issn, title, author, dewey and subject.
+
+The search parameter values are obtained from the bibliographic record whose
+data is in a hash reference in $matchpoints, as returned by Biblio::GetBiblioData().
+
+If $matchpoints is a scalar, it is assumed to be an unnamed query descriptor, e.g.
+a general purpose search argument. In this case, the returned array contains only
+entry: the key is 'title' and the value and encvalue are derived from $matchpoints.
+
+If a search parameter value is undefined or empty, it is not included in the returned
+array.
+
+The returned array reference may be passed directly to the template parameters.
+
+=over 2
+
+=item C<Output arg:>
+
+ * $array containing hash refs as described above
+
+=item C<usage in the script:>
+
+=back
+
+$data = Biblio::GetBiblioData($bibno);
+$template->param ( MYLOOP => C4::Search::z3950_search_args($data) )
+
+*OR*
+
+$template->param ( MYLOOP => C4::Search::z3950_search_args($searchscalar) )
+
+=cut
+
+sub z3950_search_args {
+ my $bibrec = shift;
+ $bibrec = { title => $bibrec } if !ref $bibrec;
+ my $array = [];
+ for my $field (qw/ lccn isbn issn title author dewey subject /)
+ {
+ my $encvalue = URI::Escape::uri_escape_utf8($bibrec->{$field});
+ push @$array, { name=>$field, value=>$bibrec->{$field}, encvalue=>$encvalue } if defined $bibrec->{$field};
+ }
+ return $array;
+}
+
+
END { } # module clean-up code here (global destructor)
1;