[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Koha-cvs] koha/opac opac-search.pl [rel_3_0]
From: |
Antoine Farnault |
Subject: |
[Koha-cvs] koha/opac opac-search.pl [rel_3_0] |
Date: |
Fri, 08 Dec 2006 15:21:06 +0000 |
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 => address@hidden,);
+$template->param( branchloop => address@hidden, );
# 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 => address@hidden);
+$template->param( itemtypeloop => address@hidden );
# # load the itypes (Called item types in the template -- just authorized
values for searching)
# my ($itypecount,@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 address@hidden; # clone the data, not just the reference
+ for ( my $i = 0 ; $i <= $search_boxes_count ; $i++ ) {
+ my $this_index = address@hidden; # clone the data, not just the
reference
address@hidden>{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 => address@hidden);
+ $template->param(
+ uc( C4::Context->preference("marcflavour") ) => 1,
+ search_boxes_loop => address@hidden
+ );
# 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;
address@hidden = split("\0",$params->{'sort_by'}) if $params->{'sort_by'};
address@hidden = 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;
address@hidden = split("\0",$params->{'server'}) if $params->{'server'};
address@hidden = 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;
address@hidden = split("\0",$params->{'op'}) if $params->{'op'};
address@hidden = split( "\0", $params->{'op'} ) if $params->{'op'};
# indexes are query qualifiers, like 'title', 'author', etc. They
# can be simple or complex
my @indexes;
address@hidden = split("\0",$params->{'idx'}) if $params->{'idx'};
address@hidden = split( "\0", $params->{'idx'} ) if $params->{'idx'};
# an operand can be a single term, a phrase, or a complete ccl query
my @operands;
address@hidden = split("\0",$params->{'q'}) if $params->{'q'};
address@hidden = 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;
address@hidden = split("\0",$params->{'limit'}) if $params->{'limit'};
address@hidden = 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,address@hidden,address@hidden,address@hidden,address@hidden);
+( $error, $search_desc, $koha_query, $federated_query, $query_type ) =
+ buildQuery( $query, address@hidden, address@hidden, address@hidden,
address@hidden );
+
# 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,address@hidden,address@hidden,$results_per_page,$offset,$expanded_facet,$branches,$query_type,$scan);
+ ( $error, $results_hashref, $facets ) = getRecords(
+ $koha_query, $federated_query, address@hidden,
+ address@hidden, $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<address@hidden;$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 => address@hidden);
+ $template->param( total => $hits );
+ $template->param( searchdesc => $search_desc );
+ $template->param( results_per_page => $results_per_page );
+ $template->param( SEARCH_RESULTS => address@hidden );
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 " ",@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 => address@hidden,
+ $template->param(
+ PAGE_NUMBERS => address@hidden,
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 => address@hidden;
- $template->param(outer_sup_results_loop => address@hidden);
+ push @sup_results_array,
+ {
+ servername => $servername,
+ inner_sup_results_loop => address@hidden
+ };
+ $template->param( outer_sup_results_loop => address@hidden );
}
}
} #/end of the for loop
-#$template->param(FEDERATED_RESULTS => address@hidden);
+#$template->param(FEDERATED_RESULTS => address@hidden);
$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 => address@hidden,
- );
+ $template->param( SPELL_SUGGEST => address@hidden, );
}
};
if ($@) {
- warn "Kohaspsuggest failure:".$@;
+ warn "Kohaspsuggest failure:" . $@;
}
}