[Koha-cvs] koha/opac opac-search.pl [rel_3_0]
Antoine Farnault
antoine at koha-fr.org
Fri Dec 8 16:21:06 CET 2006
CVSROOT: /sources/koha
Module name: koha
Branch: rel_3_0
Changes by: Antoine Farnault <toins> 06/12/08 15:21:06
Modified files:
opac : opac-search.pl
Log message:
advanced search from opac is now displayed properly.
CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/koha/opac/opac-search.pl?cvsroot=koha&only_with_tag=rel_3_0&r1=1.38.2.7&r2=1.38.2.8
Patches:
Index: opac-search.pl
===================================================================
RCS file: /sources/koha/koha/opac/opac-search.pl,v
retrieving revision 1.38.2.7
retrieving revision 1.38.2.8
diff -u -b -r1.38.2.7 -r1.38.2.8
--- opac-search.pl 7 Dec 2006 16:34:20 -0000 1.38.2.7
+++ opac-search.pl 8 Dec 2006 15:21:06 -0000 1.38.2.8
@@ -3,7 +3,7 @@
# Script to perform searching
# For documentation try 'perldoc /path/to/search'
#
-# $Header: /sources/koha/koha/opac/opac-search.pl,v 1.38.2.7 2006/12/07 16:34:20 toins Exp $
+# $Header: /sources/koha/koha/opac/opac-search.pl,v 1.38.2.8 2006/12/08 15:21:06 toins Exp $
#
# Copyright 2006 LibLime
#
@@ -140,6 +140,7 @@
=cut
use strict; # always use
+
#use warnings; # use only for development
## STEP 1. Load things that are used in both search page and
@@ -152,12 +153,13 @@
use C4::Search;
use C4::Koha;
use POSIX qw(ceil floor);
+
# create a new CGI object
# not sure undef_params option is working, need to test
use CGI qw('-no_undef_params');
my $cgi = new CGI;
-my ($template,$borrowernumber,$cookie);
+my ( $template, $borrowernumber, $cookie );
# decide which template to use
my $template_name;
@@ -216,16 +218,20 @@
# load the branches
my $branches = GetBranches();
my @branch_loop;
-push @branch_loop, {value => "", branchname => "All Branches", };
-for my $branch_hash (keys %$branches) {
- push @branch_loop, {value => "branch: $branch_hash", branchname => $branches->{$branch_hash}->{'branchname'}, };
+push @branch_loop, { value => "", branchname => "All Branches", };
+for my $branch_hash ( keys %$branches ) {
+ push @branch_loop,
+ {
+ value => "branch: $branch_hash",
+ branchname => $branches->{$branch_hash}->{'branchname'},
+ };
}
-$template->param(branchloop => \@branch_loop,);
+$template->param( branchloop => \@branch_loop, );
# load the itemtypes (Called Collection Codes in the template -- used for circ rules )
my $itemtypes = GetItemTypes;
my @itemtypesloop;
-my $selected=1;
+my $selected = 1;
my $cnt;
my $imgdir = getitemtypeimagesrc();
foreach my $thisitemtype ( sort keys %$itemtypes ) {
@@ -240,7 +246,7 @@
$selected = 0 if ($selected);
push @itemtypesloop, \%row;
}
-$template->param(itemtypeloop => \@itemtypesloop);
+$template->param( itemtypeloop => \@itemtypesloop );
# # load the itypes (Called item types in the template -- just authorized values for searching)
# my ($itypecount, at itype_loop) = GetCcodes();
@@ -254,17 +260,18 @@
# }
# The following should only be loaded if we're bringing up the advanced search template
-if ( $template_name eq "catalogue/advsearch.tmpl" ) {
+if ( $template_name eq "opac-advsearch.tmpl" ) {
+
# load the servers (used for searching -- to do federated searching, etc.)
- my $primary_servers_loop;# = displayPrimaryServers();
- $template->param(outer_servers_loop => $primary_servers_loop,);
+ my $primary_servers_loop; # = displayPrimaryServers();
+ $template->param( outer_servers_loop => $primary_servers_loop, );
- my $secondary_servers_loop;# = displaySecondaryServers();
- $template->param(outer_sup_servers_loop => $secondary_servers_loop,);
+ my $secondary_servers_loop; # = displaySecondaryServers();
+ $template->param( outer_sup_servers_loop => $secondary_servers_loop, );
# load the limit types (icon-based limits in advanced search page)
my $outer_limit_types_loop = displayLimitTypes();
- $template->param(outer_limit_types_loop => $outer_limit_types_loop,);
+ $template->param( outer_limit_types_loop => $outer_limit_types_loop, );
# load the search indexes (what a user can choose to search by)
my $indexes = displayIndexes();
@@ -276,54 +283,65 @@
# into flags for the template -- I'll work on that soon -- JF
my @search_boxes_array;
my $search_boxes_count = 1; # should be a syspref
- for (my $i=0;$i<=$search_boxes_count;$i++) {
- my $this_index =[@$indexes]; # clone the data, not just the reference
+ for ( my $i = 0 ; $i <= $search_boxes_count ; $i++ ) {
+ my $this_index = [@$indexes]; # clone the data, not just the reference
#@$this_index[$i]->{selected} = "selected";
- if ($i==0) {
+ if ( $i == 0 ) {
push @search_boxes_array,
- {indexes => $this_index,
+ {
+ indexes => $this_index,
search_boxes_label => "<span class='labels'>Search for:</span>",
- scan_index => "<input type='checkbox' name='scan' id='scan' value='1'/><label for='scan'>Scan Indexes</label>",
+ scan_index =>
+"<input type='checkbox' name='scan' id='scan' value='1'/><label for='scan'>Scan Indexes</label>",
};
}
- elsif ($i==$search_boxes_count) {
+ elsif ( $i == $search_boxes_count ) {
push @search_boxes_array,
- {indexes => $indexes,
- left_content => " <select name='op'><option value='and' selected='selected'>and</option><option value='or'>or</option><option value='not'>not</option></select>",
- add_field => "1"};
+ {
+ indexes => $indexes,
+ left_content =>
+" <select name='op'><option value='and' selected='selected'>and</option><option value='or'>or</option><option value='not'>not</option></select>",
+ add_field => "1"
+ };
}
else {
push @search_boxes_array,
- {indexes => $indexes,
- left_content => " <select name='op'><option value='and' selected='selected'>and</option><option value='or'>or</option><option value='not'>not</option></select>",};
+ {
+ indexes => $indexes,
+ left_content =>
+" <select name='op'><option value='and' selected='selected'>and</option><option value='or'>or</option><option value='not'>not</option></select>",
+ };
}
}
- $template->param(uc(C4::Context->preference("marcflavour")) => 1,
- search_boxes_loop => \@search_boxes_array);
+ $template->param(
+ uc( C4::Context->preference("marcflavour") ) => 1,
+ search_boxes_loop => \@search_boxes_array
+ );
# load the language limits (for search)
my $languages_limit_loop = displayLanguagesLimit();
- $template->param(search_languages_loop => $languages_limit_loop,);
+ $template->param( search_languages_loop => $languages_limit_loop, );
# load the subtype limits
my $outer_subtype_limits_loop = displaySubtypesLimit();
- $template->param(outer_subtype_limits_loop => $outer_subtype_limits_loop,);
+ $template->param( outer_subtype_limits_loop => $outer_subtype_limits_loop,
+ );
my $expanded_options;
- if (C4::Context->preference("expandedSearchOption")){
+ if ( C4::Context->preference("expandedSearchOption") ) {
$expanded_options = C4::Context->preference("expandedSearchOption");
}
- else{
+ else {
$expanded_options = $cgi->param('expanded_options');
}
- $template->param(expanded_options => $expanded_options);
+ $template->param( expanded_options => $expanded_options );
# load the sort_by options for the template
my $sort_by = $cgi->param('sort_by');
my $sort_by_loop = displaySortby($sort_by);
- $template->param(sort_by_loop => $sort_by_loop);
+ $template->param( sort_by_loop => $sort_by_loop );
#warn "loading the template";
output_html_with_http_headers $cgi, $cookie, $template->output;
@@ -341,47 +359,52 @@
# Params that can have more than one value
# sort by is used to sort the query
my @sort_by;
- at sort_by = split("\0",$params->{'sort_by'}) if $params->{'sort_by'};
+ at sort_by = split( "\0", $params->{'sort_by'} ) if $params->{'sort_by'};
+
# load the sort_by options for the template
my $sort_by = $params->{'sort_by'};
my $sort_by_loop = displaySortby($sort_by);
-$template->param(sort_by_loop => $sort_by_loop);
+$template->param( sort_by_loop => $sort_by_loop );
+
#
# Use the servers defined, or just search our local catalog(default)
my @servers;
- at servers = split("\0",$params->{'server'}) if $params->{'server'};
+ at servers = split( "\0", $params->{'server'} ) if $params->{'server'};
unless (@servers) {
+
#FIXME: this should be handled using Context.pm
@servers = ("biblioserver");
+
# @servers = C4::Context->config("biblioserver");
}
# operators include boolean and proximity operators and are used
# to evaluate multiple operands
my @operators;
- at operators = split("\0",$params->{'op'}) if $params->{'op'};
+ at operators = split( "\0", $params->{'op'} ) if $params->{'op'};
# indexes are query qualifiers, like 'title', 'author', etc. They
# can be simple or complex
my @indexes;
- at indexes = split("\0",$params->{'idx'}) if $params->{'idx'};
+ at indexes = split( "\0", $params->{'idx'} ) if $params->{'idx'};
# an operand can be a single term, a phrase, or a complete ccl query
my @operands;
- at operands = split("\0",$params->{'q'}) if $params->{'q'};
+ at operands = split( "\0", $params->{'q'} ) if $params->{'q'};
# limits are use to limit to results to a pre-defined category such as branch or language
my @limits;
- at limits = split("\0",$params->{'limit'}) if $params->{'limit'};
+ at limits = split( "\0", $params->{'limit'} ) if $params->{'limit'};
my $available;
-foreach my $limit(@limits) {
- if ($limit =~/available/) {
+foreach my $limit (@limits) {
+ if ( $limit =~ /available/ ) {
$available = 1;
}
}
-$template->param(available => $available);
-push @limits, map "yr:".$_, split("\0",$params->{'limit-yr'}) if $params->{'limit-yr'};
+$template->param( available => $available );
+push @limits, map "yr:" . $_, split( "\0", $params->{'limit-yr'} )
+ if $params->{'limit-yr'};
# Params that can only have one value
my $query = $params->{'q'};
@@ -394,27 +417,38 @@
# Define some global variables
my $error; # used for error handling
my $search_desc; # the query expressed in terms that humans understand
-my $koha_query; # the query expressed in terms that zoom understands with field weighting and stemming
+my $koha_query
+ ; # the query expressed in terms that zoom understands with field weighting and stemming
my $federated_query;
-my $query_type; # usually not needed, but can be used to trigger ccl, cql, or pqf queries if set
+my $query_type
+ ; # usually not needed, but can be used to trigger ccl, cql, or pqf queries if set
my @results;
## I. BUILD THE QUERY
-($error,$search_desc,$koha_query,$federated_query,$query_type) = buildQuery($query,\@operators,\@operands,\@indexes,\@limits);
+( $error, $search_desc, $koha_query, $federated_query, $query_type ) =
+ buildQuery( $query, \@operators, \@operands, \@indexes, \@limits );
+
# warn "query : $koha_query";
## II. DO THE SEARCH AND GET THE RESULTS
my $total; # the total results for the whole set
-my $facets; # this object stores the faceted results that display on the left-hand of the results page
+my $facets
+ ; # this object stores the faceted results that display on the left-hand of the results page
my @results_array;
my $results_hashref;
eval {
- ($error, $results_hashref, $facets) = getRecords($koha_query,$federated_query,\@sort_by,\@servers,$results_per_page,$offset,$expanded_facet,$branches,$query_type,$scan);
+ ( $error, $results_hashref, $facets ) = getRecords(
+ $koha_query, $federated_query, \@sort_by,
+ \@servers, $results_per_page, $offset,
+ $expanded_facet, $branches, $query_type,
+ $scan
+ );
};
-if ($@ || $error) {
- $template->param(query_error => $error.$@);
-# warn "error: ".$error.$@;
+if ( $@ || $error ) {
+ $template->param( query_error => $error . $@ );
+
+ # warn "error: ".$error.$@;
output_html_with_http_headers $cgi, $cookie, $template->output;
exit;
}
@@ -422,62 +456,91 @@
# At this point, each server has given us a result set
# now we build that set for template display
my @sup_results_array;
-for (my $i=0;$i<=@servers;$i++) {
+for ( my $i = 0 ; $i <= @servers ; $i++ ) {
my $server = $servers[$i];
- if ($server =~/biblioserver/) { # this is the local bibliographic server
+ if ( $server =~ /biblioserver/ ) { # this is the local bibliographic server
$hits = $results_hashref->{$server}->{"hits"};
- my @newresults = searchResults( $search_desc,$hits,$results_per_page,$offset,@{$results_hashref->{$server}->{"RECORDS"}});
+ my @newresults =
+ searchResults( $search_desc, $hits, $results_per_page, $offset,
+ @{ $results_hashref->{$server}->{"RECORDS"} } );
$total = $total + $results_hashref->{$server}->{"hits"};
if ($hits) {
- $template->param(total => $hits);
- $template->param(searchdesc => $search_desc );
- $template->param(results_per_page => $results_per_page);
- $template->param(SEARCH_RESULTS => \@newresults);
+ $template->param( total => $hits );
+ $template->param( searchdesc => $search_desc );
+ $template->param( results_per_page => $results_per_page );
+ $template->param( SEARCH_RESULTS => \@newresults );
my @page_numbers;
- my $pages = ceil($hits / $results_per_page);
+ my $pages = ceil( $hits / $results_per_page );
my $current_page_number = 1;
- $current_page_number = ($offset / $results_per_page + 1) if $offset;
- my $previous_page_offset = $offset - $results_per_page unless ($offset - $results_per_page <0);
+ $current_page_number = ( $offset / $results_per_page + 1 )
+ if $offset;
+ my $previous_page_offset = $offset - $results_per_page
+ unless ( $offset - $results_per_page < 0 );
my $next_page_offset = $offset + $results_per_page;
- for ($i=1; $i<=$pages;$i++) {
- my $this_offset = (($i*$results_per_page)-$results_per_page);
+ for ( $i = 1 ; $i <= $pages ; $i++ ) {
+ my $this_offset =
+ ( ( $i * $results_per_page ) - $results_per_page );
my $this_page_number = $i;
- my $highlight = 1 if ($this_page_number == $current_page_number);
- push @page_numbers, { offset => $this_offset, pg => $this_page_number, highlight => $highlight, sort_by => join " ", at sort_by };
+ my $highlight = 1
+ if ( $this_page_number == $current_page_number );
+ push @page_numbers,
+ {
+ offset => $this_offset,
+ pg => $this_page_number,
+ highlight => $highlight,
+ sort_by => join " ",
+ @sort_by
+ };
}
- $template->param(PAGE_NUMBERS => \@page_numbers,
+ $template->param(
+ PAGE_NUMBERS => \@page_numbers,
previous_page_offset => $previous_page_offset,
- next_page_offset => $next_page_offset) unless $pages < 2;
+ next_page_offset => $next_page_offset
+ ) unless $pages < 2;
}
} # end of the if local
else {
+
# check if it's a z3950 or opensearch source
my $zed3950 = 0; # FIXME :: Hardcoded value.
if ($zed3950) {
my @inner_sup_results_array;
- for my $sup_record ( @{$results_hashref->{$server}->{"RECORDS"}} ) {
- my $marc_record_object = MARC::Record->new_from_usmarc($sup_record);
- my $control_number = $marc_record_object->field('010')->subfield('a') if $marc_record_object->field('010');
+ for my $sup_record ( @{ $results_hashref->{$server}->{"RECORDS"} } )
+ {
+ my $marc_record_object =
+ MARC::Record->new_from_usmarc($sup_record);
+ my $control_number =
+ $marc_record_object->field('010')->subfield('a')
+ if $marc_record_object->field('010');
$control_number =~ s/^ //g;
- my $link = "http://catalog.loc.gov/cgi-bin/Pwebrecon.cgi?SAB1=".$control_number."&BOOL1=all+of+these&FLD1=LC+Control+Number+LCCN+%28K010%29+%28K010%29&GRP1=AND+with+next+set&SAB2=&BOOL2=all+of+these&FLD2=Keyword+Anywhere+%28GKEY%29+%28GKEY%29&PID=6211&SEQ=20060816121838&CNT=25&HIST=1";
+ my $link =
+ "http://catalog.loc.gov/cgi-bin/Pwebrecon.cgi?SAB1="
+ . $control_number
+ . "&BOOL1=all+of+these&FLD1=LC+Control+Number+LCCN+%28K010%29+%28K010%29&GRP1=AND+with+next+set&SAB2=&BOOL2=all+of+these&FLD2=Keyword+Anywhere+%28GKEY%29+%28GKEY%29&PID=6211&SEQ=20060816121838&CNT=25&HIST=1";
my $title = $marc_record_object->title();
- push @inner_sup_results_array, {
+ push @inner_sup_results_array,
+ {
'title' => $title,
'link' => $link,
};
}
my $servername = $server;
- push @sup_results_array, { servername => $servername, inner_sup_results_loop => \@inner_sup_results_array};
- $template->param(outer_sup_results_loop => \@sup_results_array);
+ push @sup_results_array,
+ {
+ servername => $servername,
+ inner_sup_results_loop => \@inner_sup_results_array
+ };
+ $template->param( outer_sup_results_loop => \@sup_results_array );
}
}
} #/end of the for loop
-#$template->param(FEDERATED_RESULTS => \@results_array);
+#$template->param(FEDERATED_RESULTS => \@results_array);
$template->param(
+
#classlist => $classlist,
total => $total,
searchdesc => $search_desc,
@@ -492,49 +555,60 @@
opacsmallimage => C4::Context->preference("opacsmallimage"),
opaclayoutstylesheet => C4::Context->preference("opaclayoutstylesheet"),
opaccolorstylesheet => C4::Context->preference("opaccolorstylesheet"),
- "BiblioDefaultView".C4::Context->preference("IntranetBiblioDefaultView") => 1,
+ "BiblioDefaultView"
+ . C4::Context->preference("IntranetBiblioDefaultView") => 1,
scan_use => $scan,
search_error => $error,
);
## Now let's find out if we have any supplemental data to show the user
# and in the meantime, save the current query for statistical purposes, etc.
my $koha_spsuggest; # a flag to tell if we've got suggestions coming from Koha
-my @koha_spsuggest; # place we store the suggestions to be returned to the template as LOOP
+my @koha_spsuggest
+ ; # place we store the suggestions to be returned to the template as LOOP
my $phrases = $search_desc;
my $ipaddress;
if ( C4::Context->preference("kohaspsuggest") ) {
eval {
my $koha_spsuggest_dbh;
+
# FIXME: this needs to be moved to Context.pm
eval {
- $koha_spsuggest_dbh=DBI->connect("DBI:mysql:suggest:66.213.78.76","auth","Free2cirC");
+ $koha_spsuggest_dbh =
+ DBI->connect( "DBI:mysql:suggest:66.213.78.76",
+ "auth", "Free2cirC" );
};
- if ($@) { warn "can't connect to spsuggest db";
+ if ($@) {
+ warn "can't connect to spsuggest db";
}
else {
- my $koha_spsuggest_insert = "INSERT INTO phrase_log(phr_phrase,phr_resultcount,phr_ip) VALUES(?,?,?)";
- my $koha_spsuggest_query = "SELECT display FROM distincts WHERE strcmp(soundex(suggestion), soundex(?)) = 0 order by soundex(suggestion) limit 0,5";
- my $koha_spsuggest_sth = $koha_spsuggest_dbh->prepare($koha_spsuggest_query);
+ my $koha_spsuggest_insert =
+"INSERT INTO phrase_log(phr_phrase,phr_resultcount,phr_ip) VALUES(?,?,?)";
+ my $koha_spsuggest_query =
+"SELECT display FROM distincts WHERE strcmp(soundex(suggestion), soundex(?)) = 0 order by soundex(suggestion) limit 0,5";
+ my $koha_spsuggest_sth =
+ $koha_spsuggest_dbh->prepare($koha_spsuggest_query);
$koha_spsuggest_sth->execute($phrases);
- while (my $spsuggestion = $koha_spsuggest_sth->fetchrow_array) {
+ while ( my $spsuggestion = $koha_spsuggest_sth->fetchrow_array ) {
$spsuggestion =~ s/(:|\/)//g;
my %line;
$line{spsuggestion} = $spsuggestion;
- push @koha_spsuggest,\%line;
+ push @koha_spsuggest, \%line;
$koha_spsuggest = 1;
}
+
# Now save the current query
- $koha_spsuggest_sth=$koha_spsuggest_dbh->prepare($koha_spsuggest_insert);
+ $koha_spsuggest_sth =
+ $koha_spsuggest_dbh->prepare($koha_spsuggest_insert);
+
#$koha_spsuggest_sth->execute($phrases,$results_per_page,$ipaddress);
$koha_spsuggest_sth->finish;
$template->param( koha_spsuggest => $koha_spsuggest ) unless $hits;
- $template->param( SPELL_SUGGEST => \@koha_spsuggest,
- );
+ $template->param( SPELL_SUGGEST => \@koha_spsuggest, );
}
};
if ($@) {
- warn "Kohaspsuggest failure:".$@;
+ warn "Kohaspsuggest failure:" . $@;
}
}
More information about the Koha-cvs
mailing list