2009-06-06 9 views
2

Ich möchte eine Konstante in meiner TT-Vorlage verwenden. In HTML::Mason (meine bisherigen Template-Engine der Wahl) Ich konnte tun:Wie kann ich Konstanten in einer Template Tookit Vorlage in einer Catalyst App definieren?

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

Wie kann ich dies tun in Template Toolkit? Wie im Titel erwähnt, ist dies eine Catalyst App, also dachte ich, ich könnte die Konstanten in den Speicher legen, aber das scheint ein bisschen peinlich.

--edit

Sorry - ich erwähnt habe, sollte ich meine eigene Konstanten verwenden möchten - exportiert von MyApp :: Konstanten, ohne Duplizierung.

+0

OK, ich fand es schwierig, eine Antwort auszuwählen - aber ich wählte fiedos, da es meiner eventuellen Lösung am nächsten kommt. Ich werde meine Konstanten in $ c-> stash injizieren, damit sie von den Vorlagen verwendet werden können - ähnlich wie sie im Template-Konstruktor übergeben werden. Die großartige Sache mit TT ist, dass es keine Sigils verwendet, also wenn sie eine Subroutine oder ein Skalar sind, werden sie auf die gleiche Weise referenziert. – cubabit

Antwort

4

In Ihrem TT-Konfiguration können Sie die VARIABLES Option verwenden, um eine Liste von Werten zu übergeben, zu übergeben wird jede Vorlage, wenn sie bearbeitet wird. Mit etwas Symboltabelle Tricks können Sie alle Ihre Konstanten in der Config aussaugen:

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:: 
        } 
     } 
    ) 
} 

Diese Symbole in dem Paket überhaupt sieht MyApp::Constants, überprüft, ob sie als Subroutinen definiert sind (das ist, was constant.pm unter das tut hood) und verwendet dann map, um ihnen einen Hashref von TT bereitzustellen.

+1

Sie könnten auch die 'CONSTANTS'-Option anstelle der' VARIABLES' verwenden Möglichkeit. –

2

Mehrere Möglichkeiten. definieren Sie einfach ein paar Variablen:

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

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

die globale Variable verwenden:

[% global.version=1.234 %] 

This is Version [% global.version %]. 

Die META-Richtlinie erlaubt eine einfache Metadatenelemente innerhalb eines Vorlage definiert werden. Diese werden ausgewertet, wenn die Vorlage geparst wird und daher nur einfache Werte enthalten kann (z. B. ist es nicht möglich, andere Variablenwerte in META-Variablen zu interpolieren).

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

Wie Sie bereits in der Frage Körper erwähnt, gibt es auch das: http://template-toolkit.org/docs/manual/Variables.html#section_Compile_Time_Constant_Folding

+0

OK - das Problem mit den ersten beiden Vorschlägen ist, dass ich meine Konstanten an einer Stelle beibehalten möchte - meine Konstanten Paket. Die "Compile Time Constant Folding" Vorschlag scheint die beste Lösung - wie ich meine Konstanten-Paket verwenden kann. Aber kann jemand erklären, wie man das in einem Catalyst Controller machen würde? – cubabit

+0

Weitere Informationen zu Konstanten in TT finden Sie unter: http://template-toolkit.org/docs/modules/Template/Namespace/Constants.html – draegtun