Unterstützung für Variablenzugriffe auf Objekte/Hashes in Druckvorlagen
authorMoritz Bunkus <moritz@bunkus.org>
Thu, 28 Oct 2010 16:01:28 +0000 (18:01 +0200)
committerSven Schöling <s.schoeling@linet-services.de>
Tue, 11 Oct 2011 12:53:58 +0000 (14:53 +0200)
Wenn z.B. SL::Order->order_details $form->{ORDER_OBJ} auf eine Instanz
von SL::DB::Order setzt, so kann im Template wie folgt darauf
zugegriffen werden:

  Kunddenname: <%ORDER_OBJ.customer.name%>

SL/Template/Simple.pm

index d7a7c35..8ad6220 100644 (file)
@@ -10,6 +10,8 @@ package SL::Template::Simple;
 
 use strict;
 
+use Scalar::Util qw(blessed);
+
 # Parameters:
 #   1. The template's file name
 #   2. A reference to the Form object
@@ -91,7 +93,19 @@ sub _get_loop_variable {
   my $form      = $self->{form};
   my $value;
 
-  if (($get_array || @indices) && (ref $form->{TEMPLATE_ARRAYS} eq 'HASH') && (ref $form->{TEMPLATE_ARRAYS}->{$var} eq 'ARRAY')) {
+  if ($var =~ m/\./) {
+    $value = $form;
+    for my $part (split(m/\./, $var)) {
+      if (ref($value) =~ m/^(?:Form|HASH)$/) {
+        $value = $value->{$part};
+      } elsif (blessed($value) && $value->can($part)) {
+        $value = $value->$part;
+      } else {
+        $value = '';
+        last;
+      }
+    }
+  } elsif (($get_array || @indices) && (ref $form->{TEMPLATE_ARRAYS} eq 'HASH') && (ref $form->{TEMPLATE_ARRAYS}->{$var} eq 'ARRAY')) {
     $value = $form->{TEMPLATE_ARRAYS}->{$var};
   } else {
     $value = $form->{$var};