This patch does the following:
1) Enables fallback for includes between different themes and different
languages (with the exact same precedence as for .tt files)
2) Enable fallback for XSLT files between different themes and different
languages (again, same precedence)
3) Change the semantics of the TT [% themelang %] variable so that it always
refers to the preferred theme and language, rather than the fallback
theme/language. As a result, all themes must include all javascript,
css and image resources they use.
Note that these changes actually have no impact whatsoever on an
installation where the default (prog) themes are in use.
Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com>
Signed-off-by: Mason James <mtj@kohaaloha.com>
Signed-off-by: Paul Poulain <paul.poulain@biblibre.com>
@ISA = qw(Exporter);
@EXPORT_OK = qw(&is_ajax ajax_fail); # More stuff should go here instead
@ISA = qw(Exporter);
@EXPORT_OK = qw(&is_ajax ajax_fail); # More stuff should go here instead
- %EXPORT_TAGS = ( all =>[qw(&themelanguage &gettemplate setlanguagecookie pagination_bar &gettemplate
+ %EXPORT_TAGS = ( all =>[qw(setlanguagecookie pagination_bar
&output_with_http_headers &output_ajax_with_http_headers &output_html_with_http_headers)],
ajax =>[qw(&output_with_http_headers &output_ajax_with_http_headers is_ajax)],
html =>[qw(&output_with_http_headers &output_html_with_http_headers)]
);
push @EXPORT, qw(
&output_with_http_headers &output_ajax_with_http_headers &output_html_with_http_headers)],
ajax =>[qw(&output_with_http_headers &output_ajax_with_http_headers is_ajax)],
html =>[qw(&output_with_http_headers &output_html_with_http_headers)]
);
push @EXPORT, qw(
- &themelanguage &gettemplate setlanguagecookie getlanguagecookie pagination_bar &gettemplate
+ setlanguagecookie getlanguagecookie pagination_bar
);
push @EXPORT, qw(
&output_html_with_http_headers &output_ajax_with_http_headers &output_with_http_headers FormatData FormatNumber
);
push @EXPORT, qw(
&output_html_with_http_headers &output_ajax_with_http_headers &output_with_http_headers FormatData FormatNumber
my $columns_def_file = "columns.def";
my $htdocs = C4::Context->config('intrahtdocs');
my $section='intranet';
my $columns_def_file = "columns.def";
my $htdocs = C4::Context->config('intrahtdocs');
my $section='intranet';
- my ($theme, $lang) = C4::Templates::themelanguage($htdocs, $columns_def_file, $section,$cgi);
+ my ($theme, $lang, $availablethemes) = C4::Templates::themelanguage($htdocs, $columns_def_file, $section,$cgi);
my $full_path_to_columns_def_file="$htdocs/$theme/$lang/$columns_def_file";
open (COLUMNS,$full_path_to_columns_def_file);
my $full_path_to_columns_def_file="$htdocs/$theme/$lang/$columns_def_file";
open (COLUMNS,$full_path_to_columns_def_file);
-__PACKAGE__->mk_accessors(qw( theme lang filename htdocs interface vars));
+__PACKAGE__->mk_accessors(qw( theme activethemes preferredtheme lang filename htdocs interface vars));
else {
$htdocs = C4::Context->config('intrahtdocs');
}
else {
$htdocs = C4::Context->config('intrahtdocs');
}
- my ($theme, $lang)= themelanguage( $htdocs, $tmplbase, $interface, $query);
+ my ($theme, $lang, $activethemes)= themelanguage( $htdocs, $tmplbase, $interface, $query);
+ my @includes;
+ foreach (@$activethemes) {
+ push @includes, "$htdocs/$_/$lang/includes";
+ push @includes, "$htdocs/$_/en/includes" unless $lang eq 'en';
+ }
my $template = Template->new(
{ EVAL_PERL => 1,
ABSOLUTE => 1,
PLUGIN_BASE => 'Koha::Template::Plugin',
COMPILE_EXT => C4::Context->config('template_cache_dir')?'.ttc':'',
COMPILE_DIR => C4::Context->config('template_cache_dir')?C4::Context->config('template_cache_dir'):'',,
my $template = Template->new(
{ EVAL_PERL => 1,
ABSOLUTE => 1,
PLUGIN_BASE => 'Koha::Template::Plugin',
COMPILE_EXT => C4::Context->config('template_cache_dir')?'.ttc':'',
COMPILE_DIR => C4::Context->config('template_cache_dir')?C4::Context->config('template_cache_dir'):'',,
- INCLUDE_PATH => [
- "$htdocs/$theme/$lang/includes",
- "$htdocs/$theme/en/includes"
- ],
+ INCLUDE_PATH => \@includes,
FILTERS => {},
}
) or die Template->error();
FILTERS => {},
}
) or die Template->error();
bless $self, $class;
$self->theme($theme);
$self->lang($lang);
bless $self, $class;
$self->theme($theme);
$self->lang($lang);
+ $self->activethemes($activethemes);
+ $self->preferredtheme($activethemes->[0]);
$self->filename($filename);
$self->htdocs($htdocs);
$self->interface($interface);
$self->filename($filename);
$self->htdocs($htdocs);
$self->interface($interface);
$vars->{themelang} = '/opac-tmpl';
}
$vars->{lang} = $self->lang;
$vars->{themelang} = '/opac-tmpl';
}
$vars->{lang} = $self->lang;
- $vars->{themelang} .= '/' . $self->theme . '/' . $self->lang;
+ $vars->{themelang} .= '/' . $self->preferredtheme . '/' . $self->lang;
$vars->{yuipath} =
( C4::Context->preference("yuipath") eq "local"
? $vars->{themelang} . "/lib/yui"
$vars->{yuipath} =
( C4::Context->preference("yuipath") eq "local"
? $vars->{themelang} . "/lib/yui"
my $is_intranet = $interface eq 'intranet';
my $htdocs = C4::Context->config($is_intranet ? 'intrahtdocs' : 'opachtdocs');
my $is_intranet = $interface eq 'intranet';
my $htdocs = C4::Context->config($is_intranet ? 'intrahtdocs' : 'opachtdocs');
- my ($theme, $lang) = themelanguage($htdocs, $tmplbase, $interface, $query);
+ my ($theme, $lang, $availablethemes) = themelanguage($htdocs, $tmplbase, $interface, $query);
# if the template doesn't exist, load the English one as a last resort
my $filename = "$htdocs/$theme/$lang/modules/$tmplbase";
# if the template doesn't exist, load the English one as a last resort
my $filename = "$htdocs/$theme/$lang/modules/$tmplbase";
my ($htdocs, $theme, $lang, $filename)
= _get_template_file($tmplbase, $interface, $query);
my $template = C4::Templates->new($interface, $filename, $tmplbase, $query);
my ($htdocs, $theme, $lang, $filename)
= _get_template_file($tmplbase, $interface, $query);
my $template = C4::Templates->new($interface, $filename, $tmplbase, $query);
- my $is_intranet = $interface eq 'intranet';
- my $themelang =
- ($is_intranet ? '/intranet-tmpl' : '/opac-tmpl') .
- "/$theme/$lang";
- $template->param(
- themelang => $themelang,
- yuipath => C4::Context->preference("yuipath") eq "local"
- ? "$themelang/lib/yui"
- : C4::Context->preference("yuipath"),
- interface => $is_intranet ? '/intranet-tmpl' : '/opac-tmpl',
- theme => $theme,
- lang => $lang
- );
+# NOTE: Commenting these out rather than deleting them so that those who need
+# to know how we previously shimmed these directories will be able to understand.
+# my $is_intranet = $interface eq 'intranet';
+# my $themelang =
+# ($is_intranet ? '/intranet-tmpl' : '/opac-tmpl') .
+# "/$theme/$lang";
+# $template->param(
+# themelang => $themelang,
+# yuipath => C4::Context->preference("yuipath") eq "local"
+# ? "$themelang/lib/yui"
+# : C4::Context->preference("yuipath"),
+# interface => $is_intranet ? '/intranet-tmpl' : '/opac-tmpl',
+# theme => $theme,
+# lang => $lang
+# );
# Bidirectionality
my $current_lang = regex_lang_subtags($lang);
# Bidirectionality
my $current_lang = regex_lang_subtags($lang);
for my $theme (@themes) {
if ( -e "$htdocs/$theme/$lang/modules/$tmpl" ) {
$_current_language = $lang;
for my $theme (@themes) {
if ( -e "$htdocs/$theme/$lang/modules/$tmpl" ) {
$_current_language = $lang;
+ return ($theme, $lang, \@themes)
}
}
# Otherwise, return prog theme in English 'en'
}
}
# Otherwise, return prog theme in English 'en'
+ return ('prog', 'en', \@themes);
my ( $biblionumber, $orig_record, $xslsyspref, $fixamps, $hidden_items ) = @_;
my $xslfilename = C4::Context->preference($xslsyspref);
if ( $xslfilename =~ /^\s*"?default"?\s*$/i ) {
my ( $biblionumber, $orig_record, $xslsyspref, $fixamps, $hidden_items ) = @_;
my $xslfilename = C4::Context->preference($xslsyspref);
if ( $xslfilename =~ /^\s*"?default"?\s*$/i ) {
+ my $htdocs;
+ my $theme;
+ my $lang = C4::Templates::_current_language();
+ my $xslfile;
if ($xslsyspref eq "XSLTDetailsDisplay") {
if ($xslsyspref eq "XSLTDetailsDisplay") {
- $xslfilename = C4::Context->config('intrahtdocs') .
- '/' . C4::Context->preference("template") .
- '/' . C4::Templates::_current_language() .
- '/xslt/' .
- C4::Context->preference('marcflavour') .
- "slim2intranetDetail.xsl";
+ $htdocs = C4::Context->config('intrahtdocs');
+ $theme = C4::Context->preference("template");
+ $xslfile = C4::Context->preference('marcflavour') .
+ "slim2intranetDetail.xsl";
} elsif ($xslsyspref eq "XSLTResultsDisplay") {
} elsif ($xslsyspref eq "XSLTResultsDisplay") {
- $xslfilename = C4::Context->config('intrahtdocs') .
- '/' . C4::Context->preference("template") .
- '/' . C4::Templates::_current_language() .
- '/xslt/' .
- C4::Context->preference('marcflavour') .
+ $htdocs = C4::Context->config('intrahtdocs');
+ $theme = C4::Context->preference("template");
+ $xslfile = C4::Context->preference('marcflavour') .
"slim2intranetResults.xsl";
} elsif ($xslsyspref eq "OPACXSLTDetailsDisplay") {
"slim2intranetResults.xsl";
} elsif ($xslsyspref eq "OPACXSLTDetailsDisplay") {
- $xslfilename = C4::Context->config('opachtdocs') .
- '/' . C4::Context->preference("opacthemes") .
- '/' . C4::Templates::_current_language() .
- '/xslt/' .
- C4::Context->preference('marcflavour') .
- "slim2OPACDetail.xsl";
+ $htdocs = C4::Context->config('opachtdocs');
+ $theme = C4::Context->preference("opacthemes");
+ $xslfile = C4::Context->preference('marcflavour') .
+ "slim2OPACDetail.xsl";
} elsif ($xslsyspref eq "OPACXSLTResultsDisplay") {
} elsif ($xslsyspref eq "OPACXSLTResultsDisplay") {
- $xslfilename = C4::Context->config('opachtdocs') .
- '/' . C4::Context->preference("opacthemes") .
- '/' . C4::Templates::_current_language() .
- '/xslt/' .
- C4::Context->preference('marcflavour') .
- "slim2OPACResults.xsl";
+ $htdocs = C4::Context->config('opachtdocs');
+ $theme = C4::Context->preference("opacthemes");
+ $xslfile = C4::Context->preference('marcflavour') .
+ "slim2OPACResults.xsl";
+ $xslfilename = "$htdocs/$theme/$lang/xslt/$xslfile";
+ $xslfilename = "$htdocs/$theme/en/xslt/$xslfile" unless ( $lang ne 'en' && !-f $xslfilename );
+ $xslfilename = "$htdocs/prog/$lang/xslt/$xslfile" unless ( !-f $xslfilename );
+ $xslfilename = "$htdocs/prog/en/xslt/$xslfile" unless ( $lang ne 'en' && !-f $xslfilename );
}
if ( $xslfilename =~ m/\{langcode\}/ ) {
}
if ( $xslfilename =~ m/\{langcode\}/ ) {
use C4::Branch;
use C4::Acquisition;
use C4::Bookseller qw(GetBookSellerFromId);
use C4::Branch;
use C4::Acquisition;
use C4::Bookseller qw(GetBookSellerFromId);
-use C4::Output; # contains gettemplate
use C4::Auth;
use C4::Serials;
use C4::Circulation; # to use itemissues
use C4::Auth;
use C4::Serials;
use C4::Circulation; # to use itemissues
$referer =~ /koha\/(.*)\.pl/;
my $from = "help/$1.tt";
my $htdocs = C4::Context->config('intrahtdocs');
$referer =~ /koha\/(.*)\.pl/;
my $from = "help/$1.tt";
my $htdocs = C4::Context->config('intrahtdocs');
- my ($theme, $lang) = C4::Templates::themelanguage( $htdocs, $from, "intranet", $input );
+ my ($theme, $lang, $availablethemes) = C4::Templates::themelanguage( $htdocs, $from, "intranet", $input );
$debug and print STDERR "help filepath: $htdocs/$theme/$lang/modules/$from";
return "$htdocs/$theme/$lang/modules/$from";
}
$debug and print STDERR "help filepath: $htdocs/$theme/$lang/modules/$from";
return "$htdocs/$theme/$lang/modules/$from";
}
# display news
# use cookie setting for language, bug default to syspref if it's not set
# display news
# use cookie setting for language, bug default to syspref if it's not set
-my ($theme, $news_lang) = C4::Templates::themelanguage(C4::Context->config('opachtdocs'),'opac-main.tt','opac',$input);
+my ($theme, $news_lang, $availablethemes) = C4::Templates::themelanguage(C4::Context->config('opachtdocs'),'opac-main.tt','opac',$input);
my $all_koha_news = &GetNewsToDisplay($news_lang);
my $koha_news_count = scalar @$all_koha_news;
my $all_koha_news = &GetNewsToDisplay($news_lang);
my $koha_news_count = scalar @$all_koha_news;