2009/2/1追記 WRAPPERで勘違いしていた。METAでしか値を渡せないのかと思ってたら、普通に渡せるんですね。下記のMETAでやってるやつ、別にMETAでやる必要がないですね orz
CatalystのTTSiteで見かけてから、WRAPPERを使って楽をするようにしています。
同じprefixで共通のものを読ませる
[% META use_jquery_multi_file_upload = 1 %]
とか、書くと、jQuery本体と、プラグインを読み込むような感じ。
ラップされるテンプレート側で
[% META use_jquery_multi_file_upload = 1 %]
のように書いて、ラップする側で、
[% IF template.use_jquery || template.use_jquery_multi_file_upload %] <script type="text/javascript" src="[% static_base %]js/jquery/jquery-1.2.6.js"></script> [% IF template.use_jquery_multi_file_upload %] <script .... [% END %][% END %]
しかし、METAのところに、ハッシュ使えないので、悲しい。
[% META template.use_jquery.multi_file_upload = 1 %]
みたいに書けない。書ければ,
[% IF template.use_jquery %]
だけで、いけるのに。
で、templateは、Template::Documentモジュールのオブジェクトなので、
Template::Documentにメソッドを追加してやることにしました。
use ExportTo ('Template::Document' => { key_match => sub { my ($self, $qr) = @_; foreach my $k (keys %$self) { return 1 if $k =~/$qr/; } return 0; } });
を追加(ExportToは、Sub::Installerでいいけど)
これで、
[% IF template.key_match('^use_jquery') %] <script type="text/javascript" src="[% static_base %]js/jquery/jquery-1.2.6.js"></script> [% END %]
と、書けて、うれしい。
※ちなみに、Template::Documentのオブジェクトなので、通常のVMethodsが使えない。keysとか
ページごとのcssやjsの読み込み
[% IF template.page_css %] <link rel="stylesheet" href="[% static_base _ 'css' _ template.page_css %]" type="text/css" media="screen"> [% END %] [% IF template.use_page_js %] <script type="text/javascript" src="[% static_base _ 'js/' _ template.use_page_js %]"></script> [% END %]
とかやって。ラップされるテンプレートで、
[% META page_css = 'hoge.css' %] [% META page_js = 'hoge.js' %]
のように、して、そのページでしか読まない奴を、html.ttで読み込むようにしています。
結構,便利。
WRAPPER要らないとき
後、WRAPPER要らないときだけど、wrapper.tt で下記のようにしてます。
[% IF template.nowrapper || template.name.match('\.(css|js|txt)'); content; ELSE; content WRAPPER site/html.tt + site/layout.tt; END; -%]
で、ラップされるとテンプレートでは、下記のようにする。
[% META nowrapper = 1%]
コードに書く場合は、下記で紹介されています。
http://d.hatena.ne.jp/holidays-l/20080806/p1