[Petal] Dynamic Templates with Petal
    Jean-Michel Hiver 
    jhiver at mkdoc.com
       
    Sun Jul  4 00:19:27 BST 2004
    
    
  
Warren Smith wrote:
> I'm having troubles getting dynamic includes to work. I'm trying to do
> something like this:
> 
> --- site.html
> <html>
>   ... header stuff ...
>     <div metal:use-macro="${content_template}#content"></div>
>   ... footer stuff ...
> </html>
Err... ouch - that's not going to work. TAL processing happens once the 
template has been compiled as a subroutine. METAL stuff is done at 
compile-time, and at that stage there is no context to take the value from.
I think the way you could do this would be defining a 'dyna_include' 
modifier, i.e. something like:
package Petal::Hash::Dyna_Include;
use base Petal::Hash::String;
use warnings;
use strict;
sub process
{
     my $self = shift;
     my $hash = shift;
     my $args = shift;
     # turns ${content_template}#content into what it should be
     my $template_name = $self->SUPER::process ($hash, $args);
     # process the template and returns the result
     my $template = new Petal ($template_name);
     return $template->process ($hash);
}
1;
__END__
Make sure your Dyna_Include file is somewhere in your @INC path, i.e. if 
you're having:
use lib ('.');
Then it should be in ./Petal/Hash/Dyna_Include.pm
Once you've done that, your template becomes:
<!-- structure keyword is here to avoid double-encoding -->
<div
   petal:content="structure dyna_include: ${content_template}#content">
Gimmick Mockup
</div>
This solution is untested, but it should work. Let me know how it goes...
Cheers,
Jean-Michel.
    
    
More information about the Petal
mailing list