2017-01-18 5 views
2

Cette question concerne l'utilisation des macros de Template :: Toolkit (Perl)Comment inclure Template :: Toolkit-Macros?

Je ne parviens pas à écrire des macros et à les placer dans un fichier séparé pour les utiliser dans plusieurs autres fichiers modèles.

Mes macros se trouvent dans un fichier modèle distinct nommé macros.tt:

----- file macros.tt ------ 
[% MACRO decorateStatus(status) BLOCK -%] 
    [% ico = 'status_unknown' -%] 
    [% IF status == "New" -%][% ico = 'status_waiting' -%] 
    [% ELSIF status == "Working" -%][% ico = 'status_work' -%] 
    [% ELSIF status == "Deleted" -%][% ico = 'status_deleted' -%] 
    [% END -%] 
    [% status %] <img src="[% c.uri_for('/images/ico/' _ ico _ '.png') %]" text="[% status %]"> 
[% END-%] 

Maintenant, je suis en train d'utiliser cette macro dans un autre template - mais cela ne fonctionne pas comme la macro est pas étendue:

----- file demo.tt ------- 
[% INCLUDE macros.tt %] 
…. 
[% status = ‘New’ %] 
<td>[% decorateStatus(status) %]</td> 
…. 

En plaçant la macro directement dans le fichier où je veux l'utiliser, tout fonctionne comme prévu.

Quelle est la manière «correcte» d'inclure des macros provenant d'un fichier différent?

Répondre

5

En utilisant INCLUDE, toutes les définitions de variables (et une macro est vraiment juste une variable de fantaisie) sont localisées dans le fichier inclus. Ce qui signifie que les définitions de macros ne sont pas visibles en dehors du fichier inclus.

Pour rendre les macros visibles dans le fichier appelant, vous avez besoin de PROCESS au lieu de INCLUDE. Comme the documentation says:

La directive PROCESS est similaire à INCLUDE mais ne réalise pas de localisation des variables avant de traiter le modèle. Toutes les modifications apportées aux variables dans le modèle inclus seront visibles dans le modèle inclus.

+0

Merci - vous êtes mon héros de la journée! Aurait dû lire le docu plus attentivement ;-) – hoppfrosch

+2

Je peux recommander un [bon livre] (http://shop.oreilly.com/product/9780596004767.do) :-) –

1

Si vous utilisez plus de 1 fichier modèle avec des macros partagées entre eux, essayez ceci:

plus facile et plus propre que d'inclure [% PROCESS 'macros.tt' %] dans chaque modèle est de rendre le processus de TT votre fichier macros avant chaque appel avec PRE_PROCESS .

use Template; 

my $tt = Template->new({ 
    INCLUDE_PATH => '/usr/local/templates', 
    PRE_PROCESS => 'macros.tt', 
})