# Suite 330, Boston, MA 02111-1307 USA
use strict;
+# use warnings; # FIXME
require Exporter;
use C4::Context;
use C4::Biblio; # GetMarcFromKohaField
@ISA = qw(Exporter);
@EXPORT = qw(
- &findseealso
&FindDuplicate
&SimpleSearch
&searchResults
&getRecords
&buildQuery
&NZgetRecords
- &ModBiblios
);
# 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);
my $search_result =
( $result->{hits}
&& $result->{hits} > 0 ? $result->{'RECORDS'} : [] );
- return ( undef, $search_result, scalar($search_result) );
+ return ( undef, $search_result, scalar($result->{hits}) );
}
else {
# FIXME hardcoded value. See catalog/search.pl & opac-search.pl too.
elsif ( $sort eq "title_za" ) {
$sort_by .= "1=4 >i ";
}
+ else {
+ warn "Ignoring unrecognized sort '$sort' requested" if $sort_by;
+ }
}
if ($sort_by) {
if ( $results[$i]->sort( "yaz", $sort_by ) < 0 ) {
# for handling ccl, cql, pqf queries in diagnostic mode, skip the rest of the steps
# DIAGNOSTIC ONLY!!
if ( $query =~ /^ccl=/ ) {
- return ( undef, $', $', $', $', '', '', '', '', 'ccl' );
+ return ( undef, $', $', "q=ccl=$'", $', '', '', '', '', 'ccl' );
}
if ( $query =~ /^cql=/ ) {
- return ( undef, $', $', $', $', '', '', '', '', 'cql' );
+ return ( undef, $', $', "q=cql=$'", $', '', '', '', '', 'cql' );
}
if ( $query =~ /^pqf=/ ) {
- return ( undef, $', $', $', $', '', '', '', '', 'pqf' );
+ return ( undef, $', $', "q=pqf=$'", $', '', '', '', '', 'pqf' );
}
# pass nested queries directly
# Some helpful index variants
my $index_plus = $index . $struct_attr . ":" if $index;
my $index_plus_comma = $index . $struct_attr . "," if $index;
+ if ($auto_truncation){
+# FIXME Auto Truncation is only valid for LTR languages
+# use C4::Output;
+# use C4::Languages qw(regex_lang_subtags get_bidi);
+# $lang = $query->cookie('KohaOpacLanguage') if (defined $query && $query->cookie('KohaOpacLanguage'));
+# my $current_lang = regex_lang_subtags($lang);
+# my $bidi;
+# $bidi = get_bidi($current_lang->{script}) if $current_lang->{script};
+ $index_plus_comma .= "rtrn:";
+ }
# Remove Stopwords
if ($remove_stopwords) {
}
# Detect Truncation
- my ( $nontruncated, $righttruncated, $lefttruncated,
- $rightlefttruncated, $regexpr );
my $truncated_operand;
- (
- $nontruncated, $righttruncated, $lefttruncated,
+ my( $nontruncated, $righttruncated, $lefttruncated,
$rightlefttruncated, $regexpr
) = _detect_truncation( $operand, $index );
warn
# add imageurl to itemtype if there is one
$oldbiblio->{imageurl} = getitemtypeimagelocation( 'opac', $itemtypes{ $oldbiblio->{itemtype} }->{imageurl} );
- $oldbiblio->{'authorised_value_images'} = C4::Items::get_authorised_value_images( C4::Biblio::get_biblio_authorised_values( $oldbiblio->{'biblionumber'} ) );
+ $oldbiblio->{'authorised_value_images'} = C4::Items::get_authorised_value_images( C4::Biblio::get_biblio_authorised_values( $oldbiblio->{'biblionumber'}, $marcrecord ) );
(my $aisbn) = $oldbiblio->{isbn} =~ /([\d-]*[X]*)/;
$aisbn =~ s/-//g;
$oldbiblio->{amazonisbn} = $aisbn;
- $oldbiblio->{description} = $itemtypes{ $oldbiblio->{itemtype} }->{description};
+ $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
if ( $itemtypes{ $oldbiblio->{itemtype} }->{summary} ) {
# save an author with no <span> tag, for the <a href=search.pl?q=<!--tmpl_var name="author"-->> link
$oldbiblio->{'author_nospan'} = $oldbiblio->{'author'};
$oldbiblio->{'title_nospan'} = $oldbiblio->{'title'};
+ $oldbiblio->{'subtitle_nospan'} = $oldbiblio->{'subtitle'};
# Add search-term highlighting to the whole record where they match using <span>s
if (C4::Context->preference("OpacHighlightedWords")){
my $searchhighlightblob;
# 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;
my $item_in_transit_count = 0;
my $can_place_holds = 0;
my $items_count = scalar(@fields);
- my $items_counter;
my $maxitems =
( C4::Context->preference('maxItemsinSearchResults') )
? C4::Context->preference('maxItemsinSearchResults') - 1
# loop through every item
foreach my $field (@fields) {
my $item;
- $items_counter++;
# populate the items hash
foreach my $code ( keys %subfieldstosearch ) {
$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}++;
$itemdamaged_count++ if $item->{damaged};
$item_in_transit_count++ if $transfertwhen ne '';
$item->{status} = $item->{wthdrawn} . "-" . $item->{itemlost} . "-" . $item->{damaged} . "-" . $item->{notforloan};
- $other_count++;
my $key = $prefix . $item->{status};
+
foreach (qw(wthdrawn itemlost damaged branchname itemcallnumber)) {
- $other_items->{$key}->{$_} = $item->{$_};
+ if($item->{notforloan} == 1){
+ $notforloan_items->{$key}->{$_} = $item->{$_};
+ }else{
+ $other_items->{$key}->{$_} = $item->{$_};
+ }
}
- $other_items->{$key}->{intransit} = ($transfertwhen ne '') ? 1 : 0;
- $other_items->{$key}->{notforloan} = GetAuthorisedValueDesc('','',$item->{notforloan},'','',$notforloan_authorised_value) if $notforloan_authorised_value;
- $other_items->{$key}->{count}++ if $item->{$hbranch};
- $other_items->{$key}->{location} = $shelflocations->{ $item->{location} };
- $other_items->{$key}->{imageurl} = getitemtypeimagelocation( 'opac', $itemtypes{ $item->{itype} }->{imageurl} );
+ if($item->{notforloan} == 1){
+ $notforloan_count++;
+
+ $notforloan_items->{$key}->{intransit} = ($transfertwhen ne '') ? 1 : 0;
+ $notforloan_items->{$key}->{notforloan} = GetAuthorisedValueDesc('','',$item->{notforloan},'','',$notforloan_authorised_value) if $notforloan_authorised_value;
+ $notforloan_items->{$key}->{count}++ if $item->{$hbranch};
+ $notforloan_items->{$key}->{location} = $shelflocations->{ $item->{location} };
+ $notforloan_items->{$key}->{imageurl} = getitemtypeimagelocation( 'opac', $itemtypes{ $item->{itype} }->{imageurl} );
+ $notforloan_items->{$key}->{barcode} = $item->{barcode};
+ }else{
+ $other_count++;
+
+ $other_items->{$key}->{intransit} = ($transfertwhen ne '') ? 1 : 0;
+ $other_items->{$key}->{notforloan} = GetAuthorisedValueDesc('','',$item->{notforloan},'','',$notforloan_authorised_value) if $notforloan_authorised_value;
+ $other_items->{$key}->{count}++ if $item->{$hbranch};
+ $other_items->{$key}->{location} = $shelflocations->{ $item->{location} };
+ $other_items->{$key}->{imageurl} = getitemtypeimagelocation( 'opac', $itemtypes{ $item->{itype} }->{imageurl} );
+ $other_items->{$key}->{barcode} = $item->{barcode};
+ }
+
}
# item is available
else {
$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}
# XSLT processing of some stuff
if (C4::Context->preference("XSLTResultsDisplay") && !$scan) {
- my $newxmlrecord = XSLTParse4Display($oldbiblio->{biblionumber},C4::Context->config('opachtdocs')."/prog/en/xslt/MARC21slim2OPACResults.xsl");
- $oldbiblio->{XSLTResultsRecord} = $newxmlrecord;
+ $oldbiblio->{XSLTResultsRecord} = XSLTParse4Display(
+ $oldbiblio->{biblionumber}, $marcrecord, 'Results' );
}
# 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;
my $record = GetMarcBiblio($biblionumber);
my $callnumber;
my ( $callnumber_tag, $callnumber_subfield ) =
- GetMarcFromKohaField( $dbh, 'items.itemcallnumber' );
+ GetMarcFromKohaField( 'items.itemcallnumber','' );
( $callnumber_tag, $callnumber_subfield ) =
- GetMarcFromKohaField('biblioitems.callnumber')
+ GetMarcFromKohaField('biblioitems.callnumber','')
unless $callnumber_tag;
if ( C4::Context->preference('marcflavour') eq 'UNIMARC' ) {
$callnumber = $record->subfield( '200', 'f' );
}
}
-=head2 ModBiblios
-
-($countchanged,$listunchanged) = ModBiblios($listbiblios, $tagsubfield,$initvalue,$targetvalue,$test);
-
-this function changes all the values $initvalue in subfield $tag$subfield in any record in $listbiblios
-test parameter if set donot perform change to records in database.
-
-=over 2
-
-=item C<input arg:>
-
- * $listbiblios is an array ref to marcrecords to be changed
- * $tagsubfield is the reference of the subfield to change.
- * $initvalue is the value to search the record for
- * $targetvalue is the value to set the subfield to
- * $test is to be set only not to perform changes in database.
-
-=item C<Output arg:>
- * $countchanged counts all the changes performed.
- * $listunchanged contains the list of all the biblionumbers of records unchanged.
-
-=item C<usage in the script:>
-
-=back
-
-my ($countchanged, $listunchanged) = EditBiblios($results->{RECORD}, $tagsubfield,$initvalue,$targetvalue);;
-#If one wants to display unchanged records, you should get biblios foreach @$listunchanged
-$template->param(countchanged => $countchanged, loopunchanged=>$listunchanged);
-
-=cut
-
-sub ModBiblios {
- my ( $listbiblios, $tagsubfield, $initvalue, $targetvalue, $test ) = @_;
- my $countmatched;
- my @unmatched;
- my ( $tag, $subfield ) = ( $1, $2 )
- if ( $tagsubfield =~ /^(\d{1,3})([a-z0-9A-Z@])?$/ );
- if ( ( length($tag) < 3 ) && $subfield =~ /0-9/ ) {
- $tag = $tag . $subfield;
- undef $subfield;
- }
- my ( $bntag, $bnsubf ) = GetMarcFromKohaField('biblio.biblionumber');
- my ( $itemtag, $itemsubf ) = GetMarcFromKohaField('items.itemnumber');
- if ($tag eq $itemtag) {
- # do not allow the embedded item tag to be
- # edited from here
- warn "Attempting to edit item tag via C4::Search::ModBiblios -- not allowed";
- return (0, []);
- }
- foreach my $usmarc (@$listbiblios) {
- my $record;
- $record = eval { MARC::Record->new_from_usmarc($usmarc) };
- my $biblionumber;
- if ($@) {
-
- # usmarc is not a valid usmarc May be a biblionumber
- # FIXME - sorry, please let's figure out whether
- # this function is to be passed a list of
- # record numbers or a list of MARC::Record
- # objects. The former is probably better
- # because the MARC records supplied by Zebra
- # may be not current.
- $record = GetMarcBiblio($usmarc);
- $biblionumber = $usmarc;
- }
- else {
- if ( $bntag >= 010 ) {
- $biblionumber = $record->subfield( $bntag, $bnsubf );
- }
- else {
- $biblionumber = $record->field($bntag)->data;
- }
- }
-
- #GetBiblionumber is to be written.
- #Could be replaced by TransformMarcToKoha (But Would be longer)
- if ( $record->field($tag) ) {
- my $modify = 0;
- foreach my $field ( $record->field($tag) ) {
- if ($subfield) {
- if (
- $field->delete_subfield(
- 'code' => $subfield,
- 'match' => qr($initvalue)
- )
- )
- {
- $countmatched++;
- $modify = 1;
- $field->update( $subfield, $targetvalue )
- if ($targetvalue);
- }
- }
- else {
- if ( $tag >= 010 ) {
- if ( $field->delete_field($field) ) {
- $countmatched++;
- $modify = 1;
- }
- }
- else {
- $field->data = $targetvalue
- if ( $field->data =~ qr($initvalue) );
- }
- }
- }
-
- # warn $record->as_formatted;
- if ($modify) {
- ModBiblio( $record, $biblionumber,
- GetFrameworkCode($biblionumber) )
- unless ($test);
- }
- else {
- push @unmatched, $biblionumber;
- }
- }
- else {
- push @unmatched, $biblionumber;
- }
- }
- return ( $countmatched, \@unmatched );
-}
-
END { } # module clean-up code here (global destructor)
1;