Hi Sam, et al,
Here are the details of (what i consider to be a bug anyway) a bug in
HTML::Template - its been bought up before, and you have mentioned that
it does need fixing, but it annoyed me enough today to produce a patch
for it and submit the patch :-)
Take the following example:
========================================================================
test.tmpl:
----------
Global Variable gvar is: <tmpl_var name=gvar>
Loop: <tmpl_loop name=testloop>
loopvar: <tmpl_var name=loopvar>
gvar : <tmpl_var name=gvar>
</tmpl_loop>
========================================================================
test.pl
-------
use strict;
use HTML::Template;
my $t = new HTML::Template(filename => "test.tmpl", global_vars => 1,)
|| die;
my $testloop = [
{ loopvar => "GVar should be set", gvar => "Loop GVar 1" },
{ loopvar => "GVar should be blank", gvar => "" },
{ loopvar => "GVar should be blank again", gvar => undef },
];
$t->param(gvar => "global variable");
$t->param(testloop => $testloop);
print $t->output();
========================================================================
When you run test.pl.. you get the following output:
------------------------------------------------------------------------
Global Variable gvar is: global variable
Loop:
loopvar: GVar should be set
gvar : Loop GVar 1
loopvar: GVar should be blank
gvar :
loopvar: GVar should be blank again
gvar : global variable
------------------------------------------------------------------------
Now, the issue is that "gvar" in the third iteration of the loop,
"should have been blank"... i explicitely set it to "undef" in the
code.. however, since global_vars was on, it ignored my "undef".
Here's a patch that fixed the problem (using HTML::Template Version 2.6)
(it might not be the most efficient.. i've only quickly written
something that seems to work... but of course, you might want to check
its efficiency etc...)
========================================================================
--- Template.pm.orig 2004-05-12 12:29:01.000000000 +1000
+++ Template.pm 2004-05-12 12:42:58.000000000 +1000
@@ -2464,6 +2464,11 @@
if (defined($value_type) and length($value_type) and ($value_type eq 'ARRAY' or
((ref($value) !~ /^(CODE)|(HASH)|(SCALAR)$/) and $value->isa('ARRAY')))) {
(ref($param_map->{$param}) eq 'HTML::Template::LOOP') or
croak("HTML::Template::param() : attempt to set parameter '$param' with an
array ref - parameter is not a TMPL_LOOP!");
+ foreach my $row (@$value) {
+ foreach my $key (keys %$row) {
+ $row->{$key} ||= "";
+ }
+ }
$param_map->{$param}[HTML::Template::LOOP::PARAM_SET] = [EMAIL PROTECTED];
} else {
(ref($param_map->{$param}) eq 'HTML::Template::VAR') or
========================================================================
simran.
--- Template.pm.orig 2004-05-12 12:29:01.000000000 +1000
+++ Template.pm 2004-05-12 12:42:58.000000000 +1000
@@ -2464,6 +2464,11 @@
if (defined($value_type) and length($value_type) and ($value_type eq 'ARRAY' or ((ref($value) !~ /^(CODE)|(HASH)|(SCALAR)$/) and $value->isa('ARRAY')))) {
(ref($param_map->{$param}) eq 'HTML::Template::LOOP') or
croak("HTML::Template::param() : attempt to set parameter '$param' with an array ref - parameter is not a TMPL_LOOP!");
+ foreach my $row (@$value) {
+ foreach my $key (keys %$row) {
+ $row->{$key} ||= "";
+ }
+ }
$param_map->{$param}[HTML::Template::LOOP::PARAM_SET] = [EMAIL PROTECTED];
} else {
(ref($param_map->{$param}) eq 'HTML::Template::VAR') or
#!/usr/bin/perl
use strict;
use HTML::Template;
my $t = new HTML::Template(filename => "test.tmpl", global_vars => 1,) || die;
my $testloop = [
{ loopvar => "GVar should be set ", gvar => "Loop GVar 1" },
{ loopvar => "GVar should be blank", gvar => "" },
{ loopvar => "GVar should be blank again", gvar => undef },
];
$t->param(gvar => "global variable");
$t->param(testloop => $testloop);
print $t->output();
Global Variable gvar is: <tmpl_var name=gvar>
Loop: <tmpl_loop name=testloop>
loopvar: <tmpl_var name=loopvar>
gvar : <tmpl_var name=gvar>
</tmpl_loop>