test action
[kivitendo-erp.git] / SL / Template / Plugin / HTMLFixes.pm
index 32d3c56..ce21b5c 100644 (file)
@@ -1,6 +1,7 @@
 package SL::Template::Plugin::HTMLFixes;
 
 use Template::Plugin::HTML;
+use Template::Stash;
 
 1;
 
@@ -12,7 +13,7 @@ use Encode;
 
 # Replacement for Template::Plugin::HTML::url.
 
-# Strings in Lx-Office are stored in Perl's internal encoding but have
+# Strings in kivitendo are stored in Perl's internal encoding but have
 # to be output as UTF-8. A normal regex replace doesn't do that
 # creating invalid UTF-8 characters upon URL-unescaping.
 
@@ -21,9 +22,25 @@ no warnings 'redefine';
 sub url {
     my ($self, $text) = @_;
     return undef unless defined $text;
-    $text =  Encode::encode('utf-8-strict', $text) if $::locale && $::locale->is_utf8;
+    $text =  Encode::encode('utf-8-strict', $text);
     $text =~ s/([^a-zA-Z0-9_.-])/uc sprintf("%%%02x",ord($1))/eg;
     return $text;
 }
 
 1;
+
+package Template::Stash;
+
+# A method for forcing list context. If a method uses 'wantarray' then
+# calling that method from Template will do strange stuff like chosing
+# scalar context. The most obvious offender are RDBO relationships.
+
+# Example of how NOT to test whether or not a customer has contacts:
+#   [% IF customer.contacts.size %] ...
+# Instead force list context and then test the size:
+#   [% IF customer.contacts.as_list.size %] ...
+$Template::Stash::LIST_OPS->{ as_list } = sub {
+  return ref( $_[0] ) eq 'ARRAY' ? shift : [shift];
+};
+
+1;