2

好吧,我已经翻了两个多小时的手册,也试图在獾书中找到解决方案,但无法提出任何可行的方法。

以下是包装器(body.tt),你明白了:

[%- PROCESS 'const.tt' -%]
<?xml version="1.0" encoding="utf-8"?>
Loads of HTML
[%- content -%]
More HTML

包装的模板如下所示:

[% WRAPPER 'body.tt' %]
Other HTML
[%- bar -%]
More other HTML
[% END %]

最后const.tt看起来像这样:

[% bar = 'foo' %]

...并且由于某种原因,bar包装模板内部的实例没有得到评估。有什么想法可以让我进行评估吗?

我努力了:

[%- content | eval -%]

...这没有用。

请注意,在包装的模板(上面的第二个块)中,我希望能够评估变量barconst.tt而不必PROCESS 'const.tt'向该模板添加另一个。毕竟变量应该可以从body.tt.

我忘了提:模板工具包 2.22 版

4

1 回答 1

2

这就是为什么您尝试的方法不起作用的原因。

正如http://template-toolkit.org/docs/manual/Directives.html#section_WRAPPER解释的那样,您的包装内容首先被评估,然后body.tt使用已评估的模板进行处理,作为content. 因此在加载content之前完成。content.tt

也就是说,有一种方法可以做到,但它有点难看。这是您的内容:

%- PROCESS 'body.tt' -%]
[%- WRAPPER body -%]
Other HTML
[%- bar -%]
More other HTML
[% END %]

这里是body.tt

[%- PROCESS 'content.tt' -%]
[% BLOCK body -%]
<?xml version="1.0" encoding="utf-8"?>
Loads of HTML
[%- content -%]
More HTML
[% END -%]

content.tt没有改变:

[% bar = 'foo' %]

虽然这行得通,但我不承诺以后必须维护它的人的理智。

于 2011-04-29T06:46:48.223 回答