ダサい解決法

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側はこれを指定したら動いた。け、ど、だせえええええ。

パッケージ化するかなぁ。

ダサいのでもっとうまい方法でやりたいんだけど。

by typester / at 2006-11-29T15:58:00 / perl · tt / Comment

MultiProviderの話

CLON - 2006/11/27 - 複数のアプリで共通のテンプレートファイルを使う

これ、 [% INCLUDE 'common:foo.tt' %] とかしたとき、さらに foo.tt の中で [% INCLUDE 'bar.tt' %] とすると common:bar.tt がインクルードされてほしいのだけどそうはならないのがびみょい。

これ用の Template::Context 作ればいいきがするけど、Templateのソース読むのだるぃ。。

by typester / at 2006-11-29T13:58:00 / perl · tt / Comment

複数のアプリで共通のテンプレートファイルを使う

にはどうしたらいいのかなーとおもって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にのってる。

by typester / at 2006-11-27T17:08:00 / perl · tt / Comment