@@ -, +, @@ --- C4/Search.pm | 17 +++--- catalogue/search.pl | 60 +++++++++++--------- .../intranet-tmpl/prog/en/css/staff-global.css | 16 +++-- .../en/modules/admin/preferences/searching.pref | 9 +-- .../prog/en/modules/catalogue/advsearch.tt | 50 ++++++++++------ koha-tmpl/opac-tmpl/prog/en/css/opac.css | 8 +- .../opac-tmpl/prog/en/modules/opac-advsearch.tt | 29 +++++++++- opac/opac-search.pl | 59 +++++++++++--------- 8 files changed, 150 insertions(+), 98 deletions(-) --- a/C4/Search.pm +++ a/C4/Search.pm @@ -1305,7 +1305,7 @@ sub buildQuery { 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/ ) { @@ -1322,17 +1322,16 @@ sub buildQuery { # 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"; } @@ -1355,9 +1354,9 @@ sub buildQuery { } } } - 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 ); --- a/catalogue/search.pl +++ a/catalogue/search.pl @@ -239,44 +239,50 @@ my $categories = GetBranchCategories(undef,'searchdomain'); $template->param(branchloop => \@branch_loop, searchdomainloop => $categories); # 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 @advancedsearchesloop; my $cnt; -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++, - ccl => qq($itype_or_itemtype,phr), +my $advanced_search_types = C4::Context->preference("AdvancedSearchTypes") || "itemtypes"; +my @advanced_search_types = split(/\|/, $advanced_search_types); + +foreach my $advanced_srch_type (@advanced_search_types) { + if ($advanced_srch_type eq 'itemtypes') { + # itemtype is a special case, since it's not defined in authorized values + my @itypesloop; + foreach my $thisitemtype ( sort {$itemtypes->{$a}->{'description'} cmp $itemtypes->{$b}->{'description'} } keys %$itemtypes ) { + my %row =( number=>$cnt++, + ccl => "$itype_or_itemtype,phr", code => $thisitemtype, - selected => $selected, description => $itemtypes->{$thisitemtype}->{'description'}, - count5 => $cnt % 4, - imageurl=> getitemtypeimagelocation( 'intranet', $itemtypes->{$thisitemtype}->{'imageurl'} ), + imageurl=> getitemtypeimagelocation( 'opac', $itemtypes->{$thisitemtype}->{'imageurl'} ), ); - $selected = 0 if ($selected) ; - push @itemtypesloop, \%row; - } - $template->param(itemtypeloop => \@itemtypesloop); -} else { - my $advsearchtypes = GetAuthorisedValues($advanced_search_types); - for my $thisitemtype (sort {$a->{'lib'} cmp $b->{'lib'}} @$advsearchtypes) { - my %row =( - number=>$cnt++, - ccl => $advanced_search_types, + push @itypesloop, \%row; + } + my %search_code = ( advanced_search_type => $advanced_srch_type, + code_loop => \@itypesloop ); + push @advancedsearchesloop, \%search_code; + } else { + # covers all the other cases: non-itemtype authorized values + my $advsearchtypes = GetAuthorisedValues($advanced_srch_type, '', 'opac'); + my @authvalueloop; + for my $thisitemtype (@$advsearchtypes) { + my %row =( + number=>$cnt++, + ccl => $advanced_srch_type, code => $thisitemtype->{authorised_value}, - selected => $selected, description => $thisitemtype->{'lib'}, - count5 => $cnt % 4, - imageurl=> getitemtypeimagelocation( 'intranet', $thisitemtype->{'imageurl'} ), - ); - push @itemtypesloop, \%row; + imageurl => getitemtypeimagelocation( 'intranet', $thisitemtype->{'imageurl'} ), + ); + push @authvalueloop, \%row; + } + my %search_code = ( advanced_search_type => $advanced_srch_type, + code_loop => \@authvalueloop ); + push @advancedsearchesloop, \%search_code; } - $template->param(itemtypeloop => \@itemtypesloop); } +$template->param(advancedsearchesloop => \@advancedsearchesloop); # The following should only be loaded if we're bringing up the advanced search template if ( $template_type eq 'advsearch' ) { --- a/koha-tmpl/intranet-tmpl/prog/en/css/staff-global.css +++ a/koha-tmpl/intranet-tmpl/prog/en/css/staff-global.css @@ -2054,32 +2054,36 @@ fieldset.rows+h3 {clear:both;padding-top:.5em;} padding-left:20px } -#advanced-search fieldset { +.adsearch { + margin: 0; +} + +.advsearch fieldset { border : 1px solid #EEE; -moz-border-radius : 3px; border-radius : 3px; } -#advanced-search fieldset.action { +.advsearch fieldset.action { border : 0; } -#advanced-search fieldset fieldset { +.advsearch fieldset fieldset { border : 1px solid #EEE; margin : 0; padding : .3em .5em; -moz-border-radius : 0; border-radius : 0; } -#advanced-search fieldset fieldset+fieldset { +.advsearch fieldset fieldset+fieldset { border-top : 0; } -#advanced-search table { +.advsearch table { border-spacing : 5px; border-collapse : separate; border-width : 0; } -#advanced-search td { +.advsearch td { border : 1px solid #EEE; padding : 0.3em 0.4em; } --- a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/searching.pref +++ a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/searching.pref @@ -71,12 +71,11 @@ Searching: - subdivisions for searches generated by clicking on subject tracings. Search Form: - - - Show checkboxes to search by + - Show tabs in OPAC and staff-side advanced search for limiting searches on the - pref: AdvancedSearchTypes - choices: - itemtypes: itemtype - ccode: collection code - - on the OPAC and staff advanced search pages. + class: long + - "fields (separate values with |). Tabs appear in the order listed.
" + - "Currently supported values: Item types (itemtypes), Collection Codes (ccode) and Shelving Location (loc)." - - By default, - pref: expandedSearchOption --- a/koha-tmpl/intranet-tmpl/prog/en/modules/catalogue/advsearch.tt +++ a/koha-tmpl/intranet-tmpl/prog/en/modules/catalogue/advsearch.tt @@ -15,6 +15,7 @@ } $(document).ready(function() { $("input[name=q]:eq(0)").focus(); + $('#advsearches > ul').tabs(); }); @@ -92,27 +93,40 @@ [New search] - - -
- Limit to any of the following + + +
+
+ + [% FOREACH advsearchloo IN advancedsearchesloop %] +
+
+ Limit to any of the following: - [% FOREACH itemtypeloo IN itemtypeloop %] - - [% UNLESS ( itemtypeloo.count5 ) %][% END %] - [% END %] - - + [% FOREACH itemtypeloo IN advsearchloo.code_loop %] + + [% UNLESS ( loop.count % 5 ) %][% END %] + [% END %] +
- [% UNLESS ( noItemTypeImages ) %] - [% IF ( itemtypeloo.imageurl ) %][% itemtypeloo.description %][% END %] - [% END %] -   -
-
- - +
+ + [% END %] + [% IF ( expanded_options ) %]
--- a/koha-tmpl/opac-tmpl/prog/en/css/opac.css +++ a/koha-tmpl/opac-tmpl/prog/en/css/opac.css @@ -660,7 +660,7 @@ input.deleteshelf:active { } /* the itemtype list in advanced search */ -#advsearch-itemtype table { +.advsearch table { border-collapse : separate; border-spacing : 3px; border : 0px; @@ -669,14 +669,14 @@ input.deleteshelf:active { border : 0px solid #D8DEB8; } -#advsearch-itemtype table tr td { +.advsearch table tr td { background-color : #F8F8EB; border : 0px; margin : 0px; width : 700px; } -#advsearch-itemtype td { +.advsearch td { font-size : 0.8em; background-color : #F8F8EB; } @@ -2293,4 +2293,4 @@ a.localimage img { border : 1px solid #8EB3E7; margin : 0 .5em; padding : .3em; -} +} --- a/koha-tmpl/opac-tmpl/prog/en/modules/opac-advsearch.tt +++ a/koha-tmpl/opac-tmpl/prog/en/modules/opac-advsearch.tt @@ -2,6 +2,12 @@ [% IF ( LibraryNameTitle ) %][% LibraryNameTitle %][% ELSE %]Koha Online[% END %] Catalog › Advanced Search [% INCLUDE 'doc-head-close.inc' %] +
@@ -130,21 +136,38 @@
+
+ -
+ [% FOREACH advsearchloo IN advancedsearchesloop %] +
Limit to any of the following: - [% FOREACH itemtypeloo IN itemtypeloop %] + [% FOREACH itemtypeloo IN advsearchloo.code_loop %] - [% UNLESS ( itemtypeloo.count5 ) %][% UNLESS ( loop.last ) %][% END %][% END %] + [% UNLESS ( loop.count % 5 ) %][% END %] [% END %]
+ [% END %] +
Language --- a/opac/opac-search.pl +++ a/opac/opac-search.pl @@ -157,40 +157,47 @@ $template->param(search_languages_loop => $languages_limit_loop,); 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 @advancedsearchesloop; my $cnt; -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++, - ccl => "$itype_or_itemtype,phr", +my $advanced_search_types = C4::Context->preference("AdvancedSearchTypes") || "itemtypes"; +my @advanced_search_types = split(/\|/, $advanced_search_types); + +foreach my $advanced_srch_type (@advanced_search_types) { + if ($advanced_srch_type eq 'itemtypes') { + # itemtype is a special case, since it's not defined in authorized values + my @itypesloop; + foreach my $thisitemtype ( sort {$itemtypes->{$a}->{'description'} cmp $itemtypes->{$b}->{'description'} } keys %$itemtypes ) { + my %row =( number=>$cnt++, + ccl => "$itype_or_itemtype,phr", code => $thisitemtype, - selected => $selected, description => $itemtypes->{$thisitemtype}->{'description'}, - count5 => $cnt % 4, imageurl=> getitemtypeimagelocation( 'opac', $itemtypes->{$thisitemtype}->{'imageurl'} ), ); - $selected = 0; # set to zero after first pass through - push @itemtypesloop, \%row; - } -} else { - my $advsearchtypes = GetAuthorisedValues($advanced_search_types, '', 'opac'); - for my $thisitemtype (@$advsearchtypes) { - my %row =( - number=>$cnt++, - ccl => $advanced_search_types, + push @itypesloop, \%row; + } + my %search_code = ( advanced_search_type => $advanced_srch_type, + code_loop => \@itypesloop ); + push @advancedsearchesloop, \%search_code; + } else { + # covers all the other cases: non-itemtype authorized values + my $advsearchtypes = GetAuthorisedValues($advanced_srch_type, '', 'opac'); + my @authvalueloop; + for my $thisitemtype (@$advsearchtypes) { + my %row =( + number=>$cnt++, + ccl => $advanced_srch_type, code => $thisitemtype->{authorised_value}, - selected => $selected, - description => $thisitemtype->{'lib'}, - count5 => $cnt % 4, - imageurl=> getitemtypeimagelocation( 'opac', $thisitemtype->{'imageurl'} ), - ); - push @itemtypesloop, \%row; + description => $thisitemtype->{'lib_opac'} || $thisitemtype->{'lib'}, + imageurl => getitemtypeimagelocation( 'opac', $thisitemtype->{'imageurl'} ), + ); + push @authvalueloop, \%row; + } + my %search_code = ( advanced_search_type => $advanced_srch_type, + code_loop => \@authvalueloop ); + push @advancedsearchesloop, \%search_code; } } -$template->param(itemtypeloop => \@itemtypesloop); +$template->param(advancedsearchesloop => \@advancedsearchesloop); # # load the itypes (Called item types in the template -- just authorized values for searching) # my ($itypecount,@itype_loop) = GetCcodes(); --