ダサい解決法
package MyProvider;
use base qw/Template::Provider/;
sub _load {
my ($data, $error) = shift->SUPER::_load(@_);
if ($data && $data->{text}) {
$data->{text} =~ s/(\[%[ ]+INCLUDE[ ]+["'])(.+)(["'].*?%\])/$1common:$2$3/;
}
($data, $error);
}
とかいう適当なProviderをつくってcommon側はこれを指定したら動いた。け、ど、だせえええええ。
パッケージ化するかなぁ。
ダサいのでもっとうまい方法でやりたいんだけど。
MultiProviderの話
これ、 [% INCLUDE 'common:foo.tt' %]
とかしたとき、さらに foo.tt の中で [% INCLUDE 'bar.tt' %]
とすると common:bar.tt
がインクルードされてほしいのだけどそうはならないのがびみょい。
これ用の Template::Context 作ればいいきがするけど、Templateのソース読むのだるぃ。。
複数のアプリで共通のテンプレートファイルを使う
にはどうしたらいいのかなーとおもってTemplateのdocを眺めていたら
my $tt = Template->new({
LOAD_TEMPLATES => [
Template::Provider->new( INCLUDE_PATH => '/path/to/myapp/templates' ),
Template::Provider->new( INCLUDE_PATH => '/path/to/common/templates' ),
],
PREFIX_MAP => {
default => 0,
common => 1,
},
});
こんな感じでやれば、
[% INCLUDE 'common:header.tt' %]
ってやれば2個目のProviderが使われるようだ。なるほど。
0とか1とかはLOAD_TEMPLATESの配列の添え字を渡すみたい。。
ちなみにTemplate::FAQにのってる。