3

我想在我的 TT 模板中使用一个常量。在HTML::Mason(我之前选择的模板引擎)中,我可以这样做:

<%once>
use MyApp::Constants qw(CONSTANT);
</%once>

如何在模板工具包中做到这一点?正如标题中提到的,这是一个Catalyst应用程序,所以我想我可以将常量放在存储中,但这似乎有点尴尬。

- 编辑

抱歉 - 我应该提到我想使用我自己的常量 - 从 MyApp::Constants 导出,没有重复。

4

2 回答 2

4

在您的 TT 配置中,您可以使用VARIABLES选项传递一个值列表,这些值在处理时将传递给每个模板。使用一些符号表技巧,您可以将所有常量吸出到配置中:

use MyApp::Constants;
use Template;


my $tt;     # template object
{ 
    no strict 'refs';
    $tt = Template->new( { 
        VARIABLES => { map { $_ => &{ 'MyApp::Constants::' . $_ } } 
                       grep { defined &{ 'MyApp::Constants::' . $_ } }
                       keys %MyApp::Constants::
                     }
        }
    )
}

这会查看 package 中的所有符号MyApp::Constants,检查它们是否被定义为子例程(这是幕后工作constant.pm),然后用于map将它们的 hashref 提供给 TT。

于 2009-06-07T10:23:40.853 回答
2

几种可能。只需定义一些变量:

[% users = {
     tom   => 'Thomas',
     dick  => 'Richard',
     larry => 'Lawrence',
   }
%]

[% FOREACH u IN users %]
   * [% u.key %] : [% u.value %]
[% END %]

使用全局变量:

[% global.version=1.234 %]

This is Version [% global.version %].

META 指令允许在模板中定义简单的元数据项。这些在模板被解析时被评估,因此可能只包含简单的值(例如,不可能将其他变量值插入到 META 变量中)。

[% META
   title   = 'The Cat in the Hat'
   author  = 'Dr. Seuss'
   version = 1.23 
%]

正如您在问题正文中已经提到的那样,还有这个: http ://template-toolkit.org/docs/manual/Variables.html#section_Compile_Time_Constant_Folding

于 2009-06-06T19:10:35.687 回答