[Koha-patches] [PATCH] Bug 13169: C4::Templates::themelanguage fails if the DB is not populated

Tomas Cohen Arazi tomascohen at gmail.com
Fri Oct 31 17:13:19 CET 2014


With the aim to remove hardcoded themes the C4::Templates::themelanguage
got dependent on the DB being populated. This patch reintroduced the
hardcoded defaults as a last resort.

To test:
- Do a fresh install, clean your browser's cache, empty DB
- Open the staff interface
=> FAIL: A "Software error" screen shows "Template process failed: file error..."
- Apply the patch
- Reload
=> SUCCESS: The webinstaller prompts for login correctly.
- Sign off :-D

Regards
---
 C4/Templates.pm | 40 +++++++++++++++++++++++++++++++---------
 1 file changed, 31 insertions(+), 9 deletions(-)

diff --git a/C4/Templates.pm b/C4/Templates.pm
index 7d09a58..3a3a65c 100644
--- a/C4/Templates.pm
+++ b/C4/Templates.pm
@@ -4,7 +4,7 @@ use strict;
 use warnings;
 use Carp;
 use CGI;
-use List::MoreUtils qw/any/;
+use List::MoreUtils qw/any uniq/;
 
 # Copyright 2009 Chris Cormack and The Koha Dev Team
 #
@@ -250,9 +250,20 @@ sub gettemplate {
 }
 
 
-#---------------------------------------------------------------------------------------------------------
-# FIXME - POD
-# FIXME - Rewritten to remove hardcoded theme with minimal changes, need to be rethinked
+=head2 themelanguage
+
+    my ($theme,$lang,\@themes) = themelanguage($htdocs,$tmpl,$interface,query);
+
+This function returns the theme and language to be used for rendering the UI.
+It also returns the list of themes that should be applied as a fallback. This is
+used for the theme overlay feature (i.e. if a file doesn't exist on the requested
+theme, fallback to the configured fallback).
+
+Important: this function is used on the webinstaller too, so always consider
+the use case where the DB is not populated already when rewriting/fixing.
+
+=cut
+
 sub themelanguage {
     my ($htdocs, $tmpl, $interface, $query) = @_;
     ($query) or warn "no query in themelanguage";
@@ -261,20 +272,31 @@ sub themelanguage {
     my $lang = C4::Languages::getlanguage($query);
 
     # Get theme
-    my @themes   = ( C4::Context->preference( ($interface eq 'intranet') ? 'template' : 'opacthemes' ) );
-    my $fallback =   C4::Context->preference( ($interface eq 'intranet') ? 'template' : 'OPACFallback' );
-    push @themes, $fallback;
+    my @themes;
+    my $theme_syspref    = ($interface eq 'intranet') ? 'template' : 'opacthemes';
+    my $fallback_syspref = ($interface eq 'intranet') ? 'template' : 'OPACFallback';
+    # Yeah, hardcoded, last resort if the DB is not populated
+    my $hardcoded_theme = ($interface eq 'intranet') ? 'prog' : 'bootstrap';
+
+    # Configured theme is the first one
+    push @themes, C4::Context->preference( $theme_syspref )
+        if C4::Context->preference( $theme_syspref );
+    # Configured fallback next
+    push @themes, C4::Context->preference( $fallback_syspref )
+        if C4::Context->preference( $fallback_syspref );
+    # The hardcoded fallback theme is the last one
+    push @themes, $hardcoded_theme;
 
     # Try to find first theme for the selected theme/lang, then for fallback/lang
     for my $theme (@themes) {
         if ( -e "$htdocs/$theme/$lang/modules/$tmpl" ) {
-            return ($theme, $lang, \@themes);
+            return ( $theme, $lang, uniq( \@themes ) );
         }
     }
     # Otherwise return theme/'en', last resort fallback/'en'
     for my $theme (@themes) {
         if ( -e "$htdocs/$theme/en/modules/$tmpl" ) {
-            return ($theme, 'en', \@themes);
+            return ( $theme, 'en', uniq( \@themes ) );
         }
     }
 }
-- 
1.9.1



More information about the Koha-patches mailing list