From 8993fb2a941502a4da89c7896912202d4c1f77ea Mon Sep 17 00:00:00 2001 From: blou Date: Wed, 2 Oct 2013 15:05:38 -0400 Subject: [PATCH] Bugs 10986 - Limit the list of languages in advanced search In Advanced Search, the list of available language is long and will only get longer. For a library offering books in 2-3 languages, that is offering too much info to the user (most of the small libraries we deal with only offer documents in two languages). Code changes: Languages.pm: Extract getAllLanguages to make a more customizable getLanguages (have getAllLanguage call it, so rest of codebase is oblivious to the change). Build array returned based on system pref if corresponding argument is set. search.pl and opac-search.pl: call getLanguages instead of getAllLanguages. TESTING 0) All language codes are iso 639-2 (three characters) 1) in OPAC, Advanced search, open Language box, acknowledge 30+ items. 2) in Intranet, go to system preferences AdvancedSearchLanguages, enter "ita|eng" 3) back in OPAC, refresh screen, acknowledge only Italian and English are listed. 4) in Intranet, click Search then click "More options" to make the Language box appear. Acknowledge limited options. 5) Regression Test: Back to the preference, empty the field then save. Go back to the OPAC and Intranet search, refresh the page, then the Language drop-box will now contain 30+ items. --- C4/Languages.pm | 30 ++++++++++++++++---- catalogue/search.pl | 4 +-- installer/data/mysql/sysprefs.sql | 3 +- installer/data/mysql/updatedatabase.pl | 7 +++++ .../en/modules/admin/preferences/searching.pref | 6 ++++ opac/opac-search.pl | 4 +-- 6 files changed, 44 insertions(+), 10 deletions(-) diff --git a/C4/Languages.pm b/C4/Languages.pm index 3a5ee2a..8d5ad7a 100644 --- a/C4/Languages.pm +++ b/C4/Languages.pm @@ -43,9 +43,10 @@ BEGIN { @EXPORT = qw( &getFrameworkLanguages &getTranslatedLanguages + &getLanguages &getAllLanguages ); - @EXPORT_OK = qw(getFrameworkLanguages getTranslatedLanguages getAllLanguages get_bidi regex_lang_subtags language_get_description accept_language); + @EXPORT_OK = qw(getFrameworkLanguages getTranslatedLanguages getAllLanguages getLanguages get_bidi regex_lang_subtags language_get_description accept_language); $DEBUG = 0; } @@ -178,14 +179,31 @@ Returns a reference to an array of hashes: =cut sub getAllLanguages { + return getLanguages(shift); +} + +=head2 getLanguages + +Returns a reference to an array of hashes. +Extracted from getAllLanguages to limit effect on the code base. +This new function (name) will allow for more arguments to customize the values returned. + +- If no parameter is passed to the function, it returns english languages names +- If a $lang parameter conforming to RFC4646 syntax is passed, the function returns languages names translated in $lang + If a language name is not translated in $lang in database, the function returns english language name +- If $isFiltered is set to true, only the detail of the languages selected in system preferences AdvanceSearchLanguages is returned. + +=cut + +sub getLanguages { my $lang = shift; -# if no parameter is passed to the function, it returns english languages names -# if a $lang parameter conforming to RFC4646 syntax is passed, the function returns languages names translated in $lang -# if a language name is not translated in $lang in database, the function returns english language name + my $isFiltered = shift; + my @languages_loop; my $dbh=C4::Context->dbh; my $default_language = 'en'; my $current_language = $default_language; + my $language_list=C4::Context->preference("AdvancedSearchLanguages") if $isFiltered; if ($lang) { $current_language = regex_lang_subtags($lang)->{'language'}; } @@ -226,7 +244,9 @@ sub getAllLanguages { $language_subtag_registry->{language_description} = $language_descriptions->{description}; } } - push @languages_loop, $language_subtag_registry; + if ( !$language_list || index ( $language_list, $language_subtag_registry->{ iso639_2_code } ) >= 0) { + push @languages_loop, $language_subtag_registry; + } } return \@languages_loop; } diff --git a/catalogue/search.pl b/catalogue/search.pl index 9e81a81..37d5012 100755 --- a/catalogue/search.pl +++ b/catalogue/search.pl @@ -144,7 +144,7 @@ use C4::Context; use C4::Output; use C4::Auth qw(:DEFAULT get_session); use C4::Search; -use C4::Languages qw(getAllLanguages); +use C4::Languages qw(getLanguages); use C4::Koha; use C4::Members qw(GetMember); use C4::VirtualShelves; @@ -339,7 +339,7 @@ if ( $template_type eq 'advsearch' ) { search_boxes_loop => \@search_boxes_array); # load the language limits (for search) - my $languages_limit_loop = getAllLanguages($lang); + my $languages_limit_loop = getLanguages($lang, 1); $template->param(search_languages_loop => $languages_limit_loop,); # Expanded search options in advanced search: diff --git a/installer/data/mysql/sysprefs.sql b/installer/data/mysql/sysprefs.sql index 4b0f364..cde879c 100644 --- a/installer/data/mysql/sysprefs.sql +++ b/installer/data/mysql/sysprefs.sql @@ -418,5 +418,6 @@ INSERT INTO systempreferences ( `variable`, `value`, `options`, `explanation`, ` ('XSLTResultsDisplay','default','','Enable XSL stylesheet control over results page display on intranet','Free'), ('yuipath','local','local|http://yui.yahooapis.com/2.5.1/build','Insert the path to YUI libraries, choose local if you use koha offline','Choice'), ('z3950AuthorAuthFields','701,702,700',NULL,'Define the MARC biblio fields for Personal Name Authorities to fill biblio.author','free'), -('z3950NormalizeAuthor','0','','If ON, Personal Name Authorities will replace authors in biblio.author','YesNo') +('z3950NormalizeAuthor','0','','If ON, Personal Name Authorities will replace authors in biblio.author','YesNo'), +('AdvancedSearchLanguages','','','ISO 639-2 codes of languages you wish to see appear as an Advanced search option. Example: eng|fre|ita','Textarea') ; diff --git a/installer/data/mysql/updatedatabase.pl b/installer/data/mysql/updatedatabase.pl index a37ea02..66ac078 100755 --- a/installer/data/mysql/updatedatabase.pl +++ b/installer/data/mysql/updatedatabase.pl @@ -7155,6 +7155,13 @@ if ( CheckVersion($DBversion) ) { SetVersion($DBversion); } +$DBversion = "3.13.00.XXX"; +if ( CheckVersion($DBversion) ) { + $dbh->do("INSERT INTO systempreferences (variable,value,options,explanation,type) VALUES('AdvancedSearchLanguages','','','ISO 639-2 codes of languages you wish to see appear as an Advanced search option. Example: eng|fra|ita','Textarea')"); + print "Upgrade to $DBversion done (Bug 10986: system preferences to limit languages in Advanced search )\n"; + SetVersion ($DBversion); +} + =head1 FUNCTIONS =head2 TableExists($table) diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/searching.pref b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/searching.pref index 29da64e..59f0be2 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/searching.pref +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/searching.pref @@ -79,6 +79,12 @@ Searching: - "fields (separate values with |). Tabs appear in the order listed.
" - "Currently supported values: Item types (itemtypes), Collection Codes (ccode) and Shelving Location (loc)." - + - Limit the languages listed in the advanced search drop-down to the + - pref: AdvancedSearchLanguages + class: long + - "ISO 639-2 language codes (separate values with | or ,)." + - "For example, to limit listing to French and Italian, enter ita|fre." + - - By default, - pref: expandedSearchOption type: boolean diff --git a/opac/opac-search.pl b/opac/opac-search.pl index 2854da6..249ef39 100755 --- a/opac/opac-search.pl +++ b/opac/opac-search.pl @@ -43,7 +43,7 @@ for ( $searchengine ) { use C4::Output; use C4::Auth qw(:DEFAULT get_session ParseSearchHistoryCookie); -use C4::Languages qw(getAllLanguages); +use C4::Languages qw(getLanguages); use C4::Search; use C4::Biblio; # GetBiblioData use C4::Koha; @@ -198,7 +198,7 @@ $template->param( ); # load the language limits (for search) -my $languages_limit_loop = getAllLanguages($lang); +my $languages_limit_loop = getLanguages($lang, 1); $template->param(search_languages_loop => $languages_limit_loop,); # load the Type stuff -- 1.7.10.4