&NZgetRecords
&AddSearchHistory
&GetDistinctValues
- &BiblioAddAuthorities
+ &enabled_staff_search_views
+ &SimpleSearch
);
-#FIXME: i had to add BiblioAddAuthorities here because in Biblios.pm it caused circular dependencies (C4::Search uses C4::Biblio, and BiblioAddAuthorities uses SimpleSearch from C4::Search)
# make all your functions, whether exported or not;
if ( !$scan && $servers[ $i - 1 ] =~ /biblioserver/ ) {
my $jmax = $size>$facets_maxrecs? $facets_maxrecs: $size;
-
- for ( my $k = 0 ; $k <= @$facets ; $k++ ) {
- ($facets->[$k]) or next;
- my @fcodes = @{$facets->[$k]->{'tags'}};
- my $sfcode = $facets->[$k]->{'subfield'};
-
+ for my $facet ( @$facets ) {
for ( my $j = 0 ; $j < $jmax ; $j++ ) {
my $render_record = $results[ $i - 1 ]->record($j)->render();
my @used_datas = ();
-
- foreach my $fcode (@fcodes) {
-
+ foreach my $tag ( @{$facet->{tags}} ) {
# avoid first line
- my $field_pattern = '\n'.$fcode.' ([^\n]+)';
+ my $tag_num = substr($tag, 0, 3);
+ my $letters = substr($tag, 3);
+ my $field_pattern = '\n' . $tag_num . ' ([^\n]+)';
my @field_tokens = ( $render_record =~ /$field_pattern/g ) ;
-
foreach my $field_token (@field_tokens) {
- my $subfield_pattern = '\$'.$sfcode.' ([^\$]+)';
- my @subfield_values = ( $field_token =~ /$subfield_pattern/g );
-
- foreach my $subfield_value (@subfield_values) {
-
- my $data = $subfield_value;
- $data =~ s/^\s+//; # trim left
- $data =~ s/\s+$//; # trim right
-
- unless ( $data ~~ @used_datas ) {
- $facets_counter->{ $facets->[$k]->{'link_value'} }->{$data}++;
- push @used_datas, $data;
+ my @subf = ( $field_token =~ /\$([a-zA-Z0-9]) ([^\$]+)/g );
+ my @values;
+ for (my $i = 0; $i < @subf; $i += 2) {
+ if ( $letters =~ $subf[$i] ) {
+ my $value = $subf[$i+1];
+ $value =~ s/^ *//;
+ $value =~ s/ *$//;
+ push @values, $value;
}
- } # subfields
+ }
+ my $data = join($facet->{sep}, @values);
+ unless ( $data ~~ @used_datas ) {
+ $facets_counter->{ $facet->{idx} }->{$data}++;
+ push @used_datas, $data;
+ }
} # fields
} # field codes
} # records
-
- $facets_info->{ $facets->[$k]->{'link_value'} }->{'label_value'} = $facets->[$k]->{'label_value'};
- $facets_info->{ $facets->[$k]->{'link_value'} }->{'expanded'} = $facets->[$k]->{'expanded'};
+ $facets_info->{ $facet->{idx} }->{label_value} = $facet->{label};
+ $facets_info->{ $facet->{idx} }->{expanded} = $facet->{expanded};
} # facets
}
- # End PROGILONE
}
# warn "connection ", $i-1, ": $size hits";
warn "QUERY BEFORE LIMITS: >$query<" if $DEBUG;
# add limits
- my $group_OR_limits;
+ my %group_OR_limits;
my $availability_limit;
foreach my $this_limit (@limits) {
if ( $this_limit =~ /available/ ) {
# group_OR_limits, prefixed by mc-
# OR every member of the group
elsif ( $this_limit =~ /mc/ ) {
-
- if ( $this_limit =~ /mc-ccode:/ ) {
+ my ($k,$v) = split(/:/, $this_limit,2);
+ if ( $k !~ /mc-i(tem)?type/ ) {
# in case the mc-ccode value has complicating chars like ()'s inside it we wrap in quotes
$this_limit =~ tr/"//d;
- my ($k,$v) = split(/:/, $this_limit,2);
$this_limit = $k.":\"".$v."\"";
}
- $group_OR_limits .= " or " if $group_OR_limits;
- $limit_desc .= " or " if $group_OR_limits;
- $group_OR_limits .= "$this_limit";
+ $group_OR_limits{$k} .= " or " if $group_OR_limits{$k};
+ $limit_desc .= " or " if $group_OR_limits{$k};
+ $group_OR_limits{$k} .= "$this_limit";
$limit_cgi .= "&limit=$this_limit";
$limit_desc .= " $this_limit";
}
}
}
}
- if ($group_OR_limits) {
+ foreach my $k (keys (%group_OR_limits)) {
$limit .= " and " if ( $query || $limit );
- $limit .= "($group_OR_limits)";
+ $limit .= "($group_OR_limits{$k})";
}
if ($availability_limit) {
$limit .= " and " if ( $query || $limit );
foreach my $code ( keys %subfieldstosearch ) {
$item->{$code} = $field->subfield( $subfieldstosearch{$code} );
}
+ $item->{description} = $itemtypes{ $item->{itype} }{description};
# Hidden items
if ($is_opac) {
$onloan_items->{$key}->{branchname} = $item->{branchname};
$onloan_items->{$key}->{location} = $shelflocations->{ $item->{location} };
$onloan_items->{$key}->{itemcallnumber} = $item->{itemcallnumber};
+ $onloan_items->{$key}->{description} = $item->{description};
$onloan_items->{$key}->{imageurl} = getitemtypeimagelocation( $search_context, $itemtypes{ $item->{itype} }->{imageurl} );
# if something's checked out and lost, mark it as 'long overdue'
if ( $item->{itemlost} ) {
$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}->{description} = $item->{description};
$other_items->{$key}->{imageurl} = getitemtypeimagelocation( $search_context, $itemtypes{ $item->{itype} }->{imageurl} );
}
# item is available
$can_place_holds = 1;
$available_count++;
$available_items->{$prefix}->{count}++ if $item->{$hbranch};
- foreach (qw(branchname itemcallnumber hideatopac)) {
+ foreach (qw(branchname itemcallnumber hideatopac description)) {
$available_items->{$prefix}->{$_} = $item->{$_};
}
$available_items->{$prefix}->{location} = $shelflocations->{ $item->{location} };
}
}
} # notforloan, item level and biblioitem level
-
+ if ($items_count > 0) {
next if $is_opac && $hideatopac_count >= $items_count;
next if $hidelostitems && $itemlost_count >= $items_count;
-
+ }
my ( $availableitemscount, $onloanitemscount, $otheritemscount );
for my $key ( sort keys %$onloan_items ) {
(++$onloanitemscount > $maxitems) and last;
push @available_items_loop, $available_items->{$key}
}
- # if biblio level itypes are used and itemtype is notforloan, it can't be reserved either
+ # XSLT processing of some stuff
+ use C4::Charset;
+ SetUTF8Flag($marcrecord);
+ $debug && warn $marcrecord->as_formatted;
+ my $interface = $search_context eq 'opac' ? 'OPAC' : '';
+ if (!$scan && C4::Context->preference($interface . "XSLTResultsDisplay")) {
+ $oldbiblio->{XSLTResultsRecord} = XSLTParse4Display($oldbiblio->{biblionumber}, $marcrecord, $interface."XSLTResultsDisplay", 1, \@hiddenitems);
+ # the last parameter tells Koha to clean up the problematic ampersand entities that Zebra outputs
+ }
+
+ # if biblio level itypes are used and itemtype is notforloan, it can't be reserved either
if (!C4::Context->preference("item-level_itypes")) {
if ($itemtypes{ $oldbiblio->{itemtype} }->{notforloan}) {
$can_place_holds = 0;
$oldbiblio->{'alternateholdings_count'} = $alternateholdingscount;
}
- # XSLT processing of some stuff
- if (!$scan && $search_context eq 'opac' && C4::Context->preference("OPACXSLTResultsDisplay")) {
- SetUTF8Flag($marcrecord);
- $debug && warn $marcrecord->as_formatted;
- # FIXME note that XSLTResultsDisplay (use of XSLT to format staff interface bib search results)
- # is not implemented yet
- $oldbiblio->{XSLTResultsRecord}
- = XSLTParse4Display($oldbiblio->{biblionumber},
- $marcrecord,
- 'Results',
- $search_context,
- 1, # clean up the problematic ampersand entities that Zebra outputs
- \@hiddenitems
- );
-
- }
-
push( @newresults, $oldbiblio );
}
return $array;
}
-=head2 BiblioAddAuthorities
-
-( $countlinked, $countcreated ) = BiblioAddAuthorities($record, $frameworkcode);
-
-this function finds the authorities linked to the biblio
- * search in the authority DB for the same authid (in $9 of the biblio)
- * search in the authority DB for the same 001 (in $3 of the biblio in UNIMARC)
- * search in the authority DB for the same values (exactly) (in all subfields of the biblio)
-OR adds a new authority record
-
-=over 2
-
-=item C<input arg:>
-
- * $record is the MARC record in question (marc blob)
- * $frameworkcode is the bibliographic framework to use (if it is "" it uses the default framework)
-
-=item C<Output arg:>
-
- * $countlinked is the number of authorities records that are linked to this authority
- * $countcreated
-
-=item C<BUGS>
- * I had to add this to Search.pm (instead of the logical Biblio.pm) because of a circular dependency (this sub uses SimpleSearch, and Search.pm uses Biblio.pm)
-
-=back
-
-=cut
-
-
-sub BiblioAddAuthorities{
- my ( $record, $frameworkcode ) = @_;
- my $dbh=C4::Context->dbh;
- my $query=$dbh->prepare(qq|
-SELECT authtypecode,tagfield
-FROM marc_subfield_structure
-WHERE frameworkcode=?
-AND (authtypecode IS NOT NULL AND authtypecode<>\"\")|);
-# SELECT authtypecode,tagfield
-# FROM marc_subfield_structure
-# WHERE frameworkcode=?
-# AND (authtypecode IS NOT NULL OR authtypecode<>\"\")|);
- $query->execute($frameworkcode);
- my ($countcreated,$countlinked);
- while (my $data=$query->fetchrow_hashref){
- foreach my $field ($record->field($data->{tagfield})){
- next if ($field->subfield('3')||$field->subfield('9'));
- # No authorities id in the tag.
- # Search if there is any authorities to link to.
- my $query='at='.$data->{authtypecode}.' ';
- map {$query.= ' and he,ext="'.$_->[1].'"' if ($_->[0]=~/[A-z]/)} $field->subfields();
- my ($error, $results, $total_hits)=SimpleSearch( $query, undef, undef, [ "authorityserver" ] );
- # there is only 1 result
- if ( $error ) {
- warn "BIBLIOADDSAUTHORITIES: $error";
- return (0,0) ;
- }
- if ( @{$results} == 1 ) {
- my $marcrecord = MARC::File::USMARC::decode($results->[0]);
- $field->add_subfields('9'=>$marcrecord->field('001')->data);
- $countlinked++;
- } elsif ( @{$results} > 1 ) {
- #More than One result
- #This can comes out of a lack of a subfield.
-# my $marcrecord = MARC::File::USMARC::decode($results->[0]);
-# $record->field($data->{tagfield})->add_subfields('9'=>$marcrecord->field('001')->data);
- $countlinked++;
- } else {
- #There are no results, build authority record, add it to Authorities, get authid and add it to 9
- ###NOTICE : This is only valid if a subfield is linked to one and only one authtypecode
- ###NOTICE : This can be a problem. We should also look into other types and rejected forms.
- my $authtypedata=C4::AuthoritiesMarc::GetAuthType($data->{authtypecode});
- next unless $authtypedata;
- my $marcrecordauth=MARC::Record->new();
- my $authfield=MARC::Field->new($authtypedata->{auth_tag_to_report},'','',"a"=>"".$field->subfield('a'));
- map { $authfield->add_subfields($_->[0]=>$_->[1]) if ($_->[0]=~/[A-z]/ && $_->[0] ne "a" )} $field->subfields();
- $marcrecordauth->insert_fields_ordered($authfield);
-
- # bug 2317: ensure new authority knows it's using UTF-8; currently
- # only need to do this for MARC21, as MARC::Record->as_xml_record() handles
- # automatically for UNIMARC (by not transcoding)
- # FIXME: AddAuthority() instead should simply explicitly require that the MARC::Record
- # use UTF-8, but as of 2008-08-05, did not want to introduce that kind
- # of change to a core API just before the 3.0 release.
- if (C4::Context->preference('marcflavour') eq 'MARC21') {
- SetMarcUnicodeFlag($marcrecordauth, 'MARC21');
- }
-
-# warn "AUTH RECORD ADDED : ".$marcrecordauth->as_formatted;
-
- my $authid=AddAuthority($marcrecordauth,'',$data->{authtypecode});
- $countcreated++;
- $field->add_subfields('9'=>$authid);
- }
- }
- }
- return ($countlinked,$countcreated);
-}
-
=head2 GetDistinctValues($field);
C<$field> is a reference to the fields array