On 2010.08.11 00:15, MySelf rdtan.net wrote:
> On 10/08/10 4:49, Dermot wrote:
>> I think you might be getting a bit confused here. TT requires
>> references for it's parameters variable, so yes array, hash references
>> (or any reference that returns a list) but that is different from how
>> you retrieve data from the DBI. You turned that data into a hash of
>> hash references when you did this:
>>
> You're absolutely correct about I'm confused. I can't differentiate
> what's array & array references, hash & hash references.
Understanding references is imho one of the most important aspects of
being able to use Perl effectively, and minimize headache.
> At one point when I try to pass multiple row of array (query from DBI
> using $sth->fetchrow_array) from perl to TT, it some how does not
> work.
That's because iirc TT accepts a hashref as the data, and you must stuff
your arrayrefs within it.
Here is an example I've cobbled together quickly (using an email template):
my ( @notices, @renewals );
if ( $blah ) {
# push a new (anonymous) hash reference onto the array
push @notices, { username => $username, hours => $hours_balance, };
}
else {
push @renewals, { username => $username, hours => $hours_balance, };
}
# create a hash for the template data, and insert
# a reference to both of the arrays within it
my %tmpl_data;
$tmpl_data{ notices } = \...@notices;
$tmpl_data{ renewals } = \...@renewals;
my $msg = MIME::Lite::TT->new(
From => $from,
To => $to,
Subject => $subject,
Template => $tmpl,
TmplParams => \%tmpl_data, # create ref of hash
);
__END__
The data structure looks like this when printed with Dumper. It is a
hash reference that has two keys, who's values contain an array
reference. Each of the two array references point to an array that
contains a hash reference as each element. The data within these hrefs
are what are used in the foreach loops within the template itself.
Note that the below output contains two loops. I refer to this output
whenever I find myself having an issue generating output from within a
template loop:
acct-dev: ISP % sudo ./b.pl
$VAR1 = {
'renewals' => [
{
'hours' => '8.84 hours remaining',
'username' => 'xxx'
},
{
'hours' => '5.51 hours remaining',
'username' => 'xxx'
},
],
'notices' => [
{
'hours' => '13.17 hours remaining',
'username' => 'xxx'
},
{
'hours' => '10 hours remaining',
'username' => 'xxx'
},
]
};
__END__
The resulting template itself:
Clients sent Notices:
[% FOREACH item IN notices %]
[%item.username%]: [%item.hours%]
[% END %]
Clients sent Renewals:
[% FOREACH item IN renewals %]
[%item.username%]: [%item.hours%]
[% END %]
> Until I stumble on this working codes from Perl Mongers and turn
> it into hash, then only it works. I was hoping someone over here can
> show some codes on how to use $sth->fetchrow_arrayref to pass arrays
> (or array references?) to TT.
I believe what you want to do is fetch the data from the db as a hashref
instead, and push the rows into an array to generate your loop topology.
untested... I haven't used DBI in quite a long time:
my @loop_array;
push @loop_array, $sth->fetchrow_hashref();
my %top_level_tmpl_data;
$top_level_tmpl_data{ db_data } = \...@loop_array;
Then, you can either create an explicit reference to the top level hash
like this:
my $tmpl_data_ref = \%top_level_tmpl_data;
...or just skip that step and create the ref as you pass the data into TT.
I hope this is what you were after. Note that I prefer to use references
directly as opposed to creating array and hash first, but I thought that
it would be better in this case if I explicitly did things the long way.
Cheers,
Steve
--
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]
http://learn.perl.org/