2017-01-18 8 views
2

この質問は、Template :: Toolkit(Perl)のマクロの使い方についてです。Template :: Toolkit- Macrosを含めるには?

マクロを書き、別のファイルに入れて別のいくつかのテンプレートファイルで使用するのに失敗しました。

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

は今、私は別のテンプレート内でこのマクロを使用しようとしている - しかし、これはマクロが展開されていないと失敗します:

私のマクロは別々のテンプレートファイルの名前macros.ttに位置している

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

マクロを使用したい場所に直接置くと、すべて正常に動作します。

別のファイルのマクロを含める「正しい」方法は何ですか?

答えて

5

INCLUDEを使用すると、すべての変数定義(およびマクロは実際には派手な変数です)は、インクルードされたファイルにローカライズされます。つまり、マクロ定義はインクルードされたファイルの外側には表示されません。

呼び出し元のファイルでマクロを表示させるには、INCLUDEの代わりにPROCESSが必要です。 the documentation says通り:

PROCESSディレクティブはINCLUDEに似ていますが、テンプレートを処理する前に、変数のいずれか ローカライズを行いません。含まれているテンプレート内の変数に変更された は、テンプレートを含む に表示されます。

+0

ありがとうございます - あなたは私の一日のヒーローです! docuをもっと慎重に読んでください;-) – hoppfrosch

+2

[良い本](http://shop.oreilly.com/product/9780596004767.do)をお勧めします:-) –

1

あなたがそれらの間で共有マクロを超える1つのテンプレートファイルを使用している場合は、これを試してみてください。

PRE_PROCESSを持つすべての呼び出しの前にTTプロセスあなたのマクロファイルを作成することですすべてのテンプレートに[% PROCESS 'macros.tt' %]を含めたよりも簡単とクリーナー。

use Template; 

my $tt = Template->new({ 
    INCLUDE_PATH => '/usr/local/templates', 
    PRE_PROCESS => 'macros.tt', 
}) 
関連する問題