From 7758e9b775941240d8bf6ac88addde9bdb8623a2 Mon Sep 17 00:00:00 2001 From: Jonathan Druart Date: Mon, 25 Nov 2013 16:39:09 +0100 Subject: [PATCH] Bug 6554: Template::output should deal with object if a ref is not HASH or ARRAY, C4::Template::output assumes it is a scalar. Which is wrong, it could be an object. --- C4/Templates.pm | 63 +++++++++----------- .../prog/en/includes/patron-toolbar.inc | 2 +- 2 files changed, 29 insertions(+), 36 deletions(-) diff --git a/C4/Templates.pm b/C4/Templates.pm index 2d2304f..6996a1a 100644 --- a/C4/Templates.pm +++ b/C4/Templates.pm @@ -34,6 +34,7 @@ use Template; use Template::Constants qw( :debug ); use C4::Languages qw(getTranslatedLanguages get_bidi regex_lang_subtags language_get_description accept_language ); +use Encode; use C4::Context; __PACKAGE__->mk_accessors(qw( theme activethemes preferredtheme lang filename htdocs interface vars)); @@ -117,15 +118,7 @@ sub output { # and clean any utf8 mess for my $k ( keys %{ $self->{VARS} } ) { $vars->{$k} = $self->{VARS}->{$k}; - if (ref($vars->{$k}) eq 'ARRAY'){ - utf8_arrayref($vars->{$k}); - } - elsif (ref($vars->{$k}) eq 'HASH'){ - utf8_hashref($vars->{$k}); - } - else { - utf8::encode($vars->{$k}) if utf8::is_utf8($vars->{$k}); - } + utf8_struct( $vars->{$k} ); } my $data; # binmode( STDOUT, ":utf8" ); @@ -134,37 +127,37 @@ sub output { return $data; } -sub utf8_arrayref { - my $arrayref = shift; - foreach my $element (@$arrayref){ - if (ref($element) eq 'ARRAY'){ - utf8_arrayref($element); - next; +sub utf8_struct { + my $element = shift; + my $ref = ref $element; + if ( $ref and $ref eq 'ARRAY' ) { + foreach my $elt ( @$element ) { + $elt = utf8_struct( $elt ); } - if (ref($element) eq 'HASH'){ - utf8_hashref($element); - next; + return $element; + } elsif ( $ref and $ref eq 'HASH' ) { + while ( my ($k, $val) = each %{$element} ) { + $element->{$k} = utf8_struct( $val ); } - utf8::encode($element) if utf8::is_utf8($element); - } -} - -sub utf8_hashref { - my $hashref = shift; - for my $key (keys %{$hashref}){ - if (ref($hashref->{$key}) eq 'ARRAY'){ - utf8_arrayref($hashref->{$key}); - next; - } - if (ref($hashref->{$key}) eq 'HASH'){ - utf8_hashref($hashref->{$key}); - next; + return $element; + } else { + if ( not ref ( $element ) or not UNIVERSAL::can($element, 'can') ) { + return Encode::is_utf8($element) + ? Encode::encode_utf8($element) + : $element; + } else { + # FIXME It is not the best to create a whitelist or a blacklist here... + return $element if ref($element) =~ /^Date/; + return $element if ref($element) =~ /^Koha::Schema/; + while ( my ( $member, $value ) = each %$element ) { + $value = utf8_struct( $value ); + $element->{$member} = $value; + } + return $element; } - utf8::encode($hashref->{$key}) if utf8::is_utf8($hashref->{$key}); } } - - + # FIXME - this is a horrible hack to cache # the current known-good language, temporarily # put in place to resolve bug 4403. It is diff --git a/koha-tmpl/intranet-tmpl/prog/en/includes/patron-toolbar.inc b/koha-tmpl/intranet-tmpl/prog/en/includes/patron-toolbar.inc index 8d36da3..c8ff82d 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/includes/patron-toolbar.inc +++ b/koha-tmpl/intranet-tmpl/prog/en/includes/patron-toolbar.inc @@ -4,7 +4,7 @@