2009-06-06 62 views
2

我想在我的TT模板中使用一个常量。在HTML::Mason(选择我以前的模板引擎),我可以这样做:如何在Catalyst应用程序中的模板Tookit模板中定义常量?

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

我怎样才能在Template Toolkit做到这一点?正如标题中提到的那样,这是一个Catalyst应用程序,所以我想我可以将常量放在藏匿处,但看起来有点尴尬。

--edit

对不起 - 我应该提到我想用我自己的常量 - 从MyApp的::常量出口,不重复。

+0

好的,我发现很难选择一个答案 - 但我选择fiedo's,因为它最接近我最终的解决方案。我会将我的常量注入到$ c-> stash中,以便它们可以被模板使用 - 类似于在Template构造函数中传递它们。 TT的好处在于它不使用sigils,因此如果它们是子程序或标量,它们的引用方式相同 – cubabit 2009-06-08 13:28:24

回答

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。

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 
    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

+0

好的 - 前两个建议的问题是我想在一个地方维护常量 - 我的常量包。 “编译时间常量折叠”建议似乎是最好的解决方案 - 因为我可以使用我的常量包。但有人可以解释一下在Catalyst控制器中如何做到这一点? – cubabit 2009-06-06 19:16:31

+0

有关TT中常量的更多详细信息,请参阅:http://template-toolkit.org/docs/modules/Template/Namespace/Constants.html – draegtun 2009-06-08 09:36:14