On Wed, Apr 6, 2011 at 5:28 PM, Michael Peters <mpet...@plusthree.com> wrote:
> On 04/06/2011 05:13 PM, Brad Baxter wrote:
>
>> But finally I decided I needed to abandon it,
>> because mentally I just couldn't handle the fact that setting an
>> attribute in the object was dependent on the attribute existing in
>> the template.
>
> I'm not sure I understand this problem. HTML template doesn't really work
> with objects, just hash references in loops. Are are you saying it was using
> your hash-based objects as if they were just hashes? That itself was
> probably not the best idea.
>
> Also, was this just a matter of turning die_on_bad_params off? I know it's
> the default, but if you don't want everything in your hashes to be in the
> template, then that's the right solution.

At the end of this note is code that produces this output:

0:[
    [] trees
    [rotten] logs
]

1:[
    [maple] trees
    [rotten] logs
]

2:[[maple] trees]

Note that "maple" appears in 1: but not in 0:, even though
the template object in both cases has these values set:

    $tmpl->param( trees  => [{ type => 'maple'  }] );
    $tmpl->param( forest => [{ logs => 'rotten' }] );

This is in fact documented:

NOTE: global_vars is not global_loops (which does not exist). That
means that loops you declare at one scope are not available inside
other loops even when global_vars is on.

So my complaint is that my perl code is setting the
same values in the $tmpl object, but the module
does not "honor" the value unless it sees the loop
in the template a certain way.  My explanation is
confusing, I know -- the whole situation is confusing
(to me).  And that's what made me have to say
enough finally after running into this multiple times.

You could say I want global everything, but what I
really want is for my template object to actually
contain the values that I set in it, so I can pass it
with "associate" to a child object.  I see someone
else is suggesting parent/child relationships be
supported, which is what I essentially was after.

>> __break__
>
> I looked at the docs for HTML::Template::Compiled (which are really sparse
> by the way with lots of circular references) and I'm not quite sure what it
> does.

It lets you output something on every
nth iteration, e.g. (from the docs),

The LOOP, WHILE and EACH tags allow you to define a BREAK attribute:

 <tmpl_loop bingo break="3"> <tmpl_var _ ><if __break__>\n</if></tmpl_loop>

    $htc->param(bingo => [qw(X 0 _ _ X 0 _ _ X)]);

outputs

    X 0 _
    _ X 0
    _ _ X


(Code for above maple trees/rotten logs example:)

#!/usr/local/bin/perl

use strict;
use warnings;
use HTML::Template;

DEMO_A: {
    my $text = <<_end_;
0:[<TMPL_LOOP forest>
    [<TMPL_LOOP trees><TMPL_VAR type></TMPL_LOOP>] trees
    [<TMPL_VAR logs>] logs
</TMPL_LOOP>]
_end_

    my $tmpl = HTML::Template->new(
    scalarref         => \$text,
    global_vars       => 1,
    die_on_bad_params => 0,
    );

    $tmpl->param( trees  => [{ type => 'maple'  }] );
    $tmpl->param( forest => [{ logs => 'rotten' }] );

    print $tmpl->output;
}

DEMO_B: {
    my $text = <<_end_;

1:[<TMPL_LOOP forest>
    [<TMPL_LOOP trees><TMPL_VAR type></TMPL_LOOP>] trees
    [<TMPL_VAR logs>] logs
</TMPL_LOOP>]

2:[<TMPL_LOOP trees>[<TMPL_VAR type>]</TMPL_LOOP> trees]

_end_

    my $tmpl = HTML::Template->new(
    scalarref         => \$text,
    global_vars       => 1,
    die_on_bad_params => 0,
    );

    $tmpl->param( trees  => [{ type => 'maple'  }] );
    $tmpl->param( forest => [{ logs => 'rotten' }] );

    print $tmpl->output;
}

__END__

------------------------------------------------------------------------------
Xperia(TM) PLAY
It's a major breakthrough. An authentic gaming
smartphone on the nation's most reliable network.
And it wants your games.
http://p.sf.net/sfu/verizon-sfdev
_______________________________________________
Html-template-users mailing list
Html-template-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/html-template-users

Reply via email to