这个问题是关于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>
….
将宏直接放在我想要使用它的文件中,一切都按预期工作。
从不同文件中包含宏的“正确”方法是什么?
答案 0 :(得分:7)
使用INCLUDE
,所有变量定义(以及宏实际上只是一个奇特的变量)都被本地化为包含的文件。这意味着宏定义在包含文件之外是不可见的。
要使宏在调用文件中可见,您需要PROCESS
而不是INCLUDE
。正如the documentation says:
PROCESS
指令与INCLUDE
类似,但不执行任何操作 在处理模板之前定位变量。任何变化 对包含的模板中的变量所做的将在 包括模板。
答案 1 :(得分:1)
如果您使用多个模板文件并在其中共享宏,请尝试以下操作:
比在每个模板中加入[% PROCESS 'macros.tt' %]
更简单,更清晰,就是在每次使用PRE_PROCESS
通话之前,让TT处理您的宏文件。
use Template;
my $tt = Template->new({
INCLUDE_PATH => '/usr/local/templates',
PRE_PROCESS => 'macros.tt',
})