On Mon, Oct 4, 2010 at 10:14 AM, David Precious <davidp@preshweb.co.uk> wrote:
Sorry for the slow & rushed reply.
No worries - thanks for responding!
Yes, HTML::Template can be a pain to work with - you're right that it doesn't
handle a hash of hashes.
This is something that needs fixing - can you raise an issue on Github at
http://github.com/bigpresh/Dancer-Template-HtmlTemplate/issues ?
I'm rather busy this week so probably won't have time to deal with it right
away.
Sounds great - I have a workaround for the moment, but I refactor my hack out and end up with a cleaner app when your patch is done.
Rather than hardcoding the param names to look at, I think I'd be inclined to
have it automatically flatten any hashrefs in the params into keys in the to
level hashref of params - so, for instance, if the params that were going to
be passed to HTML::Template looked like:
{
foo => 1,
bar => {
baz => 2,
bletch => 3,
}
}
it would get "flattened" into, say,:
{
foo => 1,
bar.baz => 2,
bar.bletch => 3,
}
Great idea - just pre-process the whole $tokens hash regardless of source.
Having to do that is nasty, but it's a limitation of HTML::Template which
doesn't let you dig into hashrefs, unlike for instance TT, where you can quite
happily use e.g. [% foo.bar %]
> 2) an alternate solution would be to make the creation of tokens a
> subroutine that a Template plugin can expose back to Dancer as an
> alternative way of serializing the tokens for the given Template engine.
> *something like:
>
> $tokens ||= {};
> if (Dancer::Template->engine->can('create_default_tokens') ) {
> $tokens = Dancer::Template->engine->create_default_tokens($tokens);
> } else {
> $tokens->{settings} = Dancer::Config->settings;
> $tokens->{request} = Dancer::SharedData->request;
> $tokens->{params} = Dancer::SharedData->request->params;
> if (setting('session')) {
> $tokens->{session} = Dancer::Session->get;
> }
> }
This might be a cleaner way, perhaps, but requires changes to Dancer's core
just to support this single template engine; on the other hand, it means
working around issues like this in future could be be easier.
Right - I was thinking someone might want to give some architectural direction, but either approach works for me.
Thanks again David.
Mike.