X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;f=catalogue%2Fsearch.pl;h=afc32a57aeb6771a74c95a9eec792979ac18f172;hb=175e4edff026414927ef2037cf103cf8e7991c5b;hp=ece25c01da6c854837ccd9c7aa31f7df1e11bbd8;hpb=b0dc874d4b6c438f8f77fad27db14c2bbe66aecf;p=koha.git diff --git a/catalogue/search.pl b/catalogue/search.pl index ece25c01da..afc32a57ae 100755 --- a/catalogue/search.pl +++ b/catalogue/search.pl @@ -208,7 +208,7 @@ if (C4::Context->preference("marcflavour") eq "UNIMARC" ) { my $branches = GetBranches(); my @branch_loop; -for my $branch_hash (sort keys %$branches) { +for my $branch_hash (sort { $branches->{$a}->{branchname} cmp $branches->{$b}->{branchname} } keys %$branches) { push @branch_loop, {value => "$branch_hash" , branchname => $branches->{$branch_hash}->{'branchname'}, }; } @@ -216,28 +216,45 @@ my $categories = GetBranchCategories(undef,'searchdomain'); $template->param(branchloop => \@branch_loop, searchdomainloop => $categories); -# load the itemtypes +# load the Type stuff +# load the Type stuff my $itemtypes = GetItemTypes; +# the index parameter is different for item-level itemtypes +my $itype_or_itemtype = (C4::Context->preference("item-level_itypes"))?'itype':'itemtype'; my @itemtypesloop; my $selected=1; my $cnt; -my $imgdir = getitemtypeimagesrc(); -foreach my $thisitemtype ( sort {$itemtypes->{$a}->{'description'} cmp $itemtypes->{$b}->{'description'} } keys %$itemtypes ) { +my $advanced_search_types = C4::Context->preference("AdvancedSearchTypes"); + +if (!$advanced_search_types or $advanced_search_types eq 'itemtypes') { foreach my $thisitemtype ( sort {$itemtypes->{$a}->{'description'} cmp $itemtypes->{$b}->{'description'} } keys %$itemtypes ) { my %row =( number=>$cnt++, - imageurl=> $itemtypes->{$thisitemtype}->{'imageurl'}?($imgdir."/".$itemtypes->{$thisitemtype}->{'imageurl'}):"", + ccl => $itype_or_itemtype, code => $thisitemtype, selected => $selected, description => $itemtypes->{$thisitemtype}->{'description'}, count5 => $cnt % 4, + imageurl=> getitemtypeimagelocation( 'intranet', $itemtypes->{$thisitemtype}->{'imageurl'} ), + ); + $selected = 0 if ($selected) ; + push @itemtypesloop, \%row; + } + $template->param(itemtypeloop => \@itemtypesloop); +} else { + my $advsearchtypes = GetAuthorisedValues($advanced_search_types); + for my $thisitemtype (@$advsearchtypes) { + my %row =( + number=>$cnt++, + ccl => $advanced_search_types, + code => $thisitemtype->{authorised_value}, + selected => $selected, + description => $thisitemtype->{'lib'}, + count5 => $cnt % 4, + imageurl=> getitemtypeimagelocation( 'intranet', $thisitemtype->{'imageurl'} ), ); - $selected = 0 if ($selected) ; - push @itemtypesloop, \%row; + push @itemtypesloop, \%row; + } + $template->param(itemtypeloop => \@itemtypesloop); } -$template->param(itemtypeloop => \@itemtypesloop); - -# load the ccodes -# my ($ccodecount,@ccode_loop) = GetCcodes(); -# $template->param(ccodeloop=>\@ccode_loop,); # The following should only be loaded if we're bringing up the advanced search template if ( $template_type eq 'advsearch' ) { @@ -248,7 +265,12 @@ if ( $template_type eq 'advsearch' ) { my $secondary_servers_loop;# = displaySecondaryServers(); $template->param(outer_sup_servers_loop => $secondary_servers_loop,); - + + # set the default sorting + my $default_sort_by = C4::Context->preference('defaultSortField')."_".C4::Context->preference('defaultSortOrder') + if (C4::Context->preference('OPACdefaultSortField') && C4::Context->preference('OPACdefaultSortOrder')); + $template->param($default_sort_by => 1); + # determine what to display next to the search boxes (ie, boolean option # shouldn't appear on the first one, scan indexes should, adding a new # box should only appear on the last, etc. @@ -339,6 +361,11 @@ my @operators; my @indexes; @indexes = split("\0",$params->{'idx'}); +# if a simple index (only one) display the index used in the top search box +if ($indexes[0] && !$indexes[1]) { + $template->param("ms_".$indexes[0] => 1);} + + # an operand can be a single term, a phrase, or a complete ccl query my @operands; @operands = split("\0",$params->{'q'}) if $params->{'q'}; @@ -376,6 +403,25 @@ if ($params->{'limit-yr'}) { #FIXME: Should return a error to the user, incorect date format specified } +# convert indexes and operands to corresponding parameter names for the z3950 search +# $ %z3950p will be a hash ref if the indexes are present (advacned search), otherwise undef +my $z3950par; +my $indexes2z3950 = { + kw=>'title', au=>'author', 'au,phr'=>'author', nb=>'isbn', ns=>'issn', + 'lcn,phr'=>'dewey', su=>'subject', 'su,phr'=>'subject', + ti=>'title', 'ti,phr'=>'title', se=>'title' +}; +for (my $ii = 0; $ii < @operands; ++$ii) +{ + my $name = $indexes2z3950->{$indexes[$ii]}; + if (defined $name && defined $operands[$ii]) + { + $z3950par ||= {}; + $z3950par->{$name} = $operands[$ii] if !exists $z3950par->{$name}; + } +} + + # Params that can only have one value my $scan = $params->{'scan'}; my $count = C4::Context->preference('numSearchResults') || 20; @@ -396,6 +442,8 @@ my @results; ## parse the query_cgi string and put it into a form suitable for s my @query_inputs; +my $scan_index_to_use; + for my $this_cgi ( split('&',$query_cgi) ) { next unless $this_cgi; $this_cgi =~ m/(.*=)(.*)/; @@ -403,8 +451,12 @@ for my $this_cgi ( split('&',$query_cgi) ) { my $input_value = $2; $input_name =~ s/=$//; push @query_inputs, { input_name => $input_name, input_value => $input_value }; + if ($input_name eq 'idx') { + $scan_index_to_use = $input_value; # unless $scan_index_to_use; + } } -$template->param ( QUERY_INPUTS => \@query_inputs ); +$template->param ( QUERY_INPUTS => \@query_inputs, + scan_index_to_use => $scan_index_to_use ); ## parse the limit_cgi string and put it into a form suitable for s my @limit_inputs; @@ -448,37 +500,6 @@ if ($@ || $error) { exit; } -# FIXME: This belongs in tools/ not in the primary search results page -my $op=$cgi->param("operation"); -if ($op eq "bulkedit"){ - my ($countchanged,$listunchanged)= - ModBiblios($results_hashref->{'biblioserver'}->{"RECORDS"}, - $params->{"tagsubfield"}, - $params->{"inputvalue"}, - $params->{"targetvalue"}, - $params->{"test"} - ); - $template->param(bulkeditresults=>1, - tagsubfield=>$params->{"tagsubfield"}, - inputvalue=>$params->{"inputvalue"}, - targetvalue=>$params->{"targetvalue"}, - countchanged=>$countchanged, - countunchanged=>scalar(@$listunchanged), - listunchanged=>$listunchanged); - - if (C4::Context->userenv->{'flags'}==1 ||(C4::Context->userenv->{'flags'} & ( 2**9 ) )){ - #Edit Catalogue Permissions - my $editable_subfields = GetManagedTagSubfields(); - # change '--' to '—' to avoid escaping issues - for (my $i = 0; $i <= $#{$editable_subfields}; $i++) { - $editable_subfields->[$i]->{subfielddesc} =~ s/--/—/g; - $editable_subfields->[$i]->{tagdesc} =~ s/--/—/g; - } - $template->param(bulkedit => 1); - $template->param(tagsubfields=>$editable_subfields); - } -} - # At this point, each server has given us a result set # now we build that set for template display my @sup_results_array; @@ -487,8 +508,27 @@ for (my $i=0;$i<@servers;$i++) { if ($server =~/biblioserver/) { # this is the local bibliographic server $hits = $results_hashref->{$server}->{"hits"}; my $page = $cgi->param('page') || 0; - my @newresults = searchResults( $query_desc,$hits,$results_per_page,$offset,@{$results_hashref->{$server}->{"RECORDS"}}); + my @newresults = searchResults( $query_desc,$hits,$results_per_page,$offset,$scan,@{$results_hashref->{$server}->{"RECORDS"}}); $total = $total + $results_hashref->{$server}->{"hits"}; + ## If there's just one result, redirect to the detail page + if ($total == 1) { + my $biblionumber=@newresults[0]->{biblionumber}; + my $defaultview = C4::Context->preference('IntranetBiblioDefaultView'); + my $views = { C4::Search::enabled_staff_search_views }; + if ($defaultview eq 'isbd' && $views->{can_view_ISBD}) { + print $cgi->redirect("/cgi-bin/koha/catalogue/ISBDdetail.pl?biblionumber=$biblionumber"); + } elsif ($defaultview eq 'marc' && $views->{can_view_MARC}) { + print $cgi->redirect("/cgi-bin/koha/catalogue/MARCdetail.pl?biblionumber=$biblionumber"); + } elsif ($defaultview eq 'labeled_marc' && $views->{can_view_labeledMARC}) { + print $cgi->redirect("/cgi-bin/koha/catalogue/labeledMARCdetail.pl?biblionumber=$biblionumber"); + } else { + print $cgi->redirect("/cgi-bin/koha/catalogue/detail.pl?biblionumber=$biblionumber"); + } + exit; + } + + + if ($hits) { $template->param(total => $hits); my $limit_cgi_not_availablity = $limit_cgi; @@ -498,6 +538,7 @@ for (my $i=0;$i<@servers;$i++) { $template->param(query_cgi => $query_cgi); $template->param(query_desc => $query_desc); $template->param(limit_desc => $limit_desc); + $template->param (z3950_search_params => C4::Search::z3950_search_args($query_desc)); if ($query_desc || $limit_desc) { $template->param(searchdesc => 1); } @@ -535,6 +576,9 @@ for (my $i=0;$i<@servers;$i++) { } } + + + # now, show twenty pages, with the current one smack in the middle else { for (my $i=$current_page_number; $i<=($current_page_number + 20 );$i++) { @@ -552,10 +596,21 @@ for (my $i=0;$i<@servers;$i++) { previous_page_offset => $previous_page_offset) unless $pages < 2; $template->param( next_page_offset => $next_page_offset) unless $pages eq $current_page_number; } + + + + + # no hits else { $template->param(searchdesc => 1,query_desc => $query_desc,limit_desc => $limit_desc); + $template->param (z3950_search_params => C4::Search::z3950_search_args($z3950par || $query_desc)); } + + + + + } # end of the if local # asynchronously search the authority server