2009-06-06 58 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