Bug 10986: add system preference to limit the list of languages in advanced search
authorblou <philippe.blouin@inlibro.com>
Wed, 2 Oct 2013 19:05:38 +0000 (15:05 -0400)
committerGalen Charlton <gmc@esilibrary.com>
Sat, 19 Apr 2014 17:18:32 +0000 (17:18 +0000)
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 many options 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.

Signed-off-by: Mathieu Saby <mathieu.saby@univ-rennes2.fr>
Signed-off-by: Jonathan Druart <jonathan.druart@biblibre.com>
Signed-off-by: Galen Charlton <gmc@esilibrary.com>
C4/Languages.pm
catalogue/search.pl
installer/data/mysql/sysprefs.sql
installer/data/mysql/updatedatabase.pl
koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/searching.pref
opac/opac-search.pl

index 2a74b92..75b9690 100644 (file)
@@ -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;
 }
index a391dfe..b3419be 100755 (executable)
@@ -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:
index 8b2241a..13506d1 100644 (file)
@@ -429,5 +429,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')
 ;
index 7a35c62..7e1d3fd 100755 (executable)
@@ -7154,6 +7154,7 @@ if ( CheckVersion($DBversion) ) {
     SetVersion($DBversion);
 }
 
+<<<<<<< HEAD
 $DBversion = "3.13.00.023";
 if ( CheckVersion($DBversion) ) {
     $dbh->do("ALTER TABLE borrowers CHANGE password password VARCHAR(60);");
@@ -7165,6 +7166,12 @@ $DBversion = "3.13.00.024";
 if ( CheckVersion($DBversion) ) {
     $dbh->do(q{ALTER TABLE z3950servers ADD COLUMN recordtype VARCHAR(45) NOT NULL DEFAULT 'biblio' AFTER description;});
     print "Upgrade to $DBversion done (Bug 10096 - Add a Z39.50 interface for authority searching)\n";
+}
+
+$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);
 }
 
index 29da64e..e75dac7 100644 (file)
@@ -78,6 +78,12 @@ Searching:
               class: long
             - "fields (separate values with |). Tabs appear in the order listed.<br/>"
             - "<em>Currently supported values</em>: Item types (<strong>itemtypes</strong>), Collection Codes (<strong>ccode</strong>) and Shelving Location (<strong>loc</strong>)."
+        -
+            - 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 <em>ita|fre</em>."
         -
             - By default,
             - pref: expandedSearchOption
index a7f16f6..83f16d8 100755 (executable)
@@ -43,7 +43,7 @@ for ( $searchengine ) {
 
 use C4::Output;
 use C4::Auth qw(:DEFAULT get_session ParseSearchHistorySession SetSearchHistorySession);
-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