如何在Catalyst应用程序中的Template Toolkit模板中定义常量?

时间:2009-06-06 19:00:30

标签: perl constants catalyst template-toolkit

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

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

我如何在Template Toolkit中执行此操作?正如标题中所提到的,这是一个Catalyst应用程序,所以我想我可以把常量放在藏匿处,但这看起来有点尴尬。

- 修改

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

2 个答案:

答案 0 :(得分: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::
                     }
        }
    )
}

这会查看包MyApp::Constants中的所有符号,检查它们是否被定义为子例程(这是constant.pm所做的内容),然后使用map来提供将它们的hashref转换为TT。

答案 1 :(得分: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指令允许简单   要在a中定义的元数据项   模板。这些是在评估时评估的   模板被解析,因此可能   只包含简单的值(例如它   不可能插入其他   变量值转换为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