[Templates] Couldn't render template "file error - page_content: not found

Andy Wardley abw@wardley.org
Tue, 01 Aug 2006 18:42:06 +0100


Bill Moseley wrote:
> Then after correcting the syntax error I get:
> 
> TT produced an error:
> [file error - one: not found]

Hi Bill,

Add this line to Template::Parser in the parse() method.

+++ Parser.pm   2006-07-31 10:00:54.000000000 +0100
@@ -244,6 +244,7 @@
      # store for blocks defined in the template (see define_block()) 

      my $defblock = $self->{ DEFBLOCK } = { };
      my $metadata = $self->{ METADATA } = [ ];
+    $self->{ DEFBLOCKS } = [ ];

(sorry if my dumb-ass mailer has screwed up the formatting -
Thunderbird is far prettier than mutt, but *please* give me a decent
text editor!)

The problem only occurs if the syntax error is inside a block.  The
parser, on encountering a BLOCK, pushes the name onto
$self->{ DEFBLOCKS } and pops it off again when it sees the END.

This way, it can correctly identify the inner block defined below
as 'foo/bar'

    [% BLOCK foo %]
       ...
       [% BLOCK bar %]
       ...
       [% END %]
    [% END %]

The problem is that if the parser bombs out while parsing a BLOCK, the
DEFBLOCKS doesn't get cleared.  When the parser tries again next time,
it thinks it's still inside the 'foo' block.  So it ends up thinking
'foo' is 'foo/foo' and 'foo/bar' is 'foo/foo/bar'.

That's why it couldn't find the block you asked for - the parser had
screwed the name up.

Clear the DEFBLOCKS explicitly every time the parser begins a parse()
and the problem goes away!

Changes are in CVS.

Cheers
A