Practice of Programming

プログラム とか Linuxとかの話題

TemplateのWRAPPER

2009/2/1追記 WRAPPERで勘違いしていた。METAでしか値を渡せないのかと思ってたら、普通に渡せるんですね。下記のMETAでやってるやつ、別にMETAでやる必要がないですね orz

CatalystのTTSiteで見かけてから、WRAPPERを使って楽をするようにしています。

同じprefixで共通のものを読ませる

jQueryとそのプラグインとかですね。

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