【问题标题】:How to include Template::Toolkit- Macros?如何包含 Template::Toolkit- 宏?
【发布时间】:2017-06-02 18:52:39
【问题描述】:

这个问题是关于 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>
….

将宏直接放在我想使用它的文件中,一切都按预期工作。

包含来自不同文件的宏的“正确”方法是什么?

【问题讨论】:

    标签: perl template-toolkit


    【解决方案1】:

    使用INCLUDE,所有变量定义(宏实际上只是一个花哨的变量)都本地化到包含的文件中。这意味着宏定义在包含的文件之外是不可见的。

    要使宏在调用文件中可见,您需要PROCESS 而不是INCLUDE。作为the documentation says

    PROCESS 指令类似于INCLUDE 但不执行任何 在处理模板之前对变量进行本地化。任何变化 包含的模板中的变量将在 包括模板。

    【讨论】:

    • 谢谢 - 你是我今天的英雄!应该更仔细地阅读文档;-)
    • 我可以推荐一个good book :-)
    【解决方案2】:

    如果您使用超过 1 个模板文件并在它们之间共享宏,请尝试以下操作:

    比在每个模板中包含[% PROCESS 'macros.tt' %] 更简单、更简洁的是让TT 在每次调用PRE_PROCESS 之前处理您的宏文件。

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

    【讨论】:

      猜你喜欢
      • 2012-03-12
      • 2013-01-27
      • 2011-06-18
      • 2011-01-19
      • 1970-01-01
      • 2015-01-09
      • 2013-02-04
      • 2010-09-22
      相关资源
      最近更新 更多