如何包含Template::Toolkit的宏?

4
这个问题涉及到使用Template::Toolkit(Perl)中的宏。
我无法编写宏并将它们放入单独的文件中,以便在几个其他模板文件中使用它们。
我的宏位于名为macros.tt的单独模板文件中:
----- file macros.tt ------
[% MACRO decorateStatus(status) BLOCK -%]
    [% ico = 'status_unknown' -%]
    [% IF status == "New" -%][% ico = 'status_waiting' -%]
    [% ELSIF status == "Working" -%][% ico = 'status_work' -%]
    [% ELSIF status == "Deleted" -%][% ico = 'status_deleted' -%]
    [% END -%]
    [% status %] <img src="[% c.uri_for('/images/ico/' _ ico _ '.png') %]" text="[% status %]">
[% END-%]

现在我正试图在另一个模板中使用这个宏,但是失败了,因为宏没有展开:

----- file demo.tt -------
[% INCLUDE macros.tt %]
….
[% status = ‘New’ %]
<td>[% decorateStatus(status) %]</td>
….

将宏直接放在想要使用它的文件中,一切都按预期工作。
从不同的文件中包含宏的“正确”方式是什么?
2个回答

8

使用INCLUDE指令,所有变量定义(宏本质上也只是一个高级变量)都会被限定在所包含的文件中。这意味着宏的定义在所包含的文件外不可见。

如果要在调用文件中看到宏的定义,需要使用PROCESS指令代替INCLUDE。如文档所述

PROCESS指令类似于INCLUDE,但在处理模板之前不执行任何变量本地化。在所包含的模板内对变量所做的任何更改都将在包含模板中可见。


1
谢谢 - 你是我今天的英雄!应该更仔细地阅读文档;-) - hoppfrosch
2
我可以推荐一本好书 :-) - Dave Cross

1
如果您正在使用多个包含共享宏的模板文件,请尝试以下方法:
比在每个模板中包含[% PROCESS 'macros.tt' %]更简单和更清洁的方法是在每次调用之前使用PRE_PROCESS让TT处理您的宏文件。
use Template;

my $tt = Template->new({
    INCLUDE_PATH => '/usr/local/templates',
    PRE_PROCESS  => 'macros.tt',
})

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接