Die Funktionen in Template.pm zum Ersetzen von Schleifenvariablen so erweitert, dass...
[kivitendo-erp.git] / SL / Template.pm
index 8a9e683..4cbde74 100644 (file)
@@ -39,14 +39,16 @@ sub _init {
 }
 
 sub set_tag_style {
-  my $self              = shift;
-  my $tag_start         = shift;
-  my $tag_end           = shift;
-
-  $self->{tag_start}    = $tag_start;
-  $self->{tag_end}      = $tag_end;
-  $self->{tag_start_qm} = quotemeta $tag_start;
-  $self->{tag_end_qm}   = quotemeta $tag_end;
+  my $self                    = shift;
+  my $tag_start               = shift;
+  my $tag_end                 = shift;
+
+  $self->{tag_start}          = $tag_start;
+  $self->{tag_end}            = $tag_end;
+  $self->{tag_start_qm}       = quotemeta $tag_start;
+  $self->{tag_end_qm}         = quotemeta $tag_end;
+
+  $self->{substitute_vars_re} = "$self->{tag_start_qm}(.+?)$self->{tag_end_qm}";
 }
 
 sub cleanup {
@@ -77,6 +79,47 @@ sub uses_temp_file {
   return 0;
 }
 
+sub _get_loop_variable {
+  my $self      = shift;
+  my $var       = shift;
+  my $get_array = shift;
+  my @indices   = @_;
+
+  my $form      = $self->{form};
+  my $value;
+
+  if (($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};
+  }
+
+  for (my $i = 0; $i < scalar(@indices); $i++) {
+    last unless (ref($value) eq "ARRAY");
+    $value = $value->[$indices[$i]];
+  }
+
+  return $value;
+}
+
+sub substitute_vars {
+  my ($self, $text, @indices) = @_;
+
+  my $form = $self->{"form"};
+
+  while ($text =~ /$self->{substitute_vars_re}/) {
+    my ($tag_pos, $tag_len) = ($-[0], $+[0] - $-[0]);
+    my ($var, @options)     = split(/\s+/, $1);
+
+    my $value               = $self->_get_loop_variable($var, 0, @indices);
+    $value                  = $self->format_string($value) unless (grep(/^NOESCAPE$/, @options));
+
+    substr($text, $tag_pos, $tag_len, $value);
+  }
+
+  return $text;
+}
+
 1;
 
 ####
@@ -92,7 +135,9 @@ use vars qw(@ISA);
 sub new {
   my $type = shift;
 
-  return $type->SUPER::new(@_);
+  my $self = $type->SUPER::new(@_);
+
+  return $self;
 }
 
 sub format_string {
@@ -117,37 +162,12 @@ sub format_string {
   return $variable;
 }
 
-sub substitute_vars {
-  my ($self, $text, @indices) = @_;
-
-  my $form = $self->{"form"};
-
-  while ($text =~ /$self->{tag_start_qm}(.+?)$self->{tag_end_qm}/) {
-    my ($tag_pos, $tag_len) = ($-[0], $+[0] - $-[0]);
-    my ($var, @options) = split(/\s+/, $1);
-    my $value = $form->{$var};
-
-    for (my $i = 0; $i < scalar(@indices); $i++) {
-      last unless (ref($value) eq "ARRAY");
-      $value = $value->[$indices[$i]];
-    }
-    $value = $self->format_string($value) unless (grep(/^NOESCAPE$/, @options));
-    substr($text, $tag_pos, $tag_len) = $value;
-  }
-
-  return $text;
-}
-
 sub parse_foreach {
   my ($self, $var, $text, $start_tag, $end_tag, @indices) = @_;
 
   my ($form, $new_contents) = ($self->{"form"}, "");
 
-  my $ary = $form->{$var};
-  for (my $i = 0; $i < scalar(@indices); $i++) {
-    last unless (ref($ary) eq "ARRAY");
-    $ary = $ary->[$indices[$i]];
-  }
+  my $ary = $self->_get_loop_variable($var, 1, @indices);
 
   my $sum = 0;
   my $current_page = 1;
@@ -756,28 +776,12 @@ sub new {
     }
   }
 
-  $self->{"rnd"} = int(rand(1000000));
+  $self->{"rnd"}   = int(rand(1000000));
   $self->{"iconv"} = Text::Iconv->new($main::dbcharset, "UTF-8");
 
-  return $self;
-}
-
-sub substitute_vars {
-  my ($self, $text, @indices) = @_;
-
-  my $form = $self->{"form"};
-
-  while ($text =~ /\&lt;\%(.*?)\%\&gt;/) {
-    my $value = $form->{$1};
+  $self->set_tag_style('&lt;%', '%&gt;');
 
-    for (my $i = 0; $i < scalar(@indices); $i++) {
-      last unless (ref($value) eq "ARRAY");
-      $value = $value->[$indices[$i]];
-    }
-    substr($text, $-[0], $+[0] - $-[0]) = $self->format_string($value);
-  }
-
-  return $text;
+  return $self;
 }
 
 sub parse_foreach {
@@ -785,11 +789,7 @@ sub parse_foreach {
 
   my ($form, $new_contents) = ($self->{"form"}, "");
 
-  my $ary = $form->{$var};
-  for (my $i = 0; $i < scalar(@indices); $i++) {
-    last unless (ref($ary) eq "ARRAY");
-    $ary = $ary->[$indices[$i]];
-  }
+  my $ary = $self->_get_loop_variable($var, 1, @indices);
 
   for (my $i = 0; $i < scalar(@{$ary}); $i++) {
     $form->{"__first__"} = $i == 0;