TTのWrapperを変えたいよね、と言う話。

TTのWRAPPERって便利ですよね。ある程度のガワを用意すればbodyタグの中身だけを書くだけでいい。

けどWRAPPERの中身は変えられても外身は変えられないんですよね。


たとえばinner.htmlがこんなんで

This is inner!

outer.htmlがこんなん

This is outer!
[% contents %]

で、outer.htmlをWRAPPERに指定してinner.htmlをtemplateに指定すると

This is outer!
This is inner!

となるはずです。inner.htmlはすぐに変えられるんですがouter.htmlってどこで変えるのんと言うことでPOD探しても見つからなかったのでちょっと調査。


すると以外とあっさり見つかった。

#ref $self eq 'MyApp::View::TT'
$self->template->{SERVICE}->{WRAPPER}

をいじればWRAPPER変えられるみたいです!
ここにはarray refを入れなきゃ行けない模様で、それはTT内でのcontentsとプラスの使い方と同じみたいです。

[% contents a.html + b.html %]

$self->template->{SERVICE}->{WRAPPER} = [ qw/a.html b.html/ ]

と同じ見たいです。ごめんなさい逆さかもしれません、複数でプラスで結合は使ったこと無いのでよくわかりませんPOD見てください。


まぁこれだけじゃアレなので、templateはstashで指定するんだからwrapperもstashで指定出来たらいいんじゃね?と思い軽く書いてみた。

sub process {
    my($self,$c) = @_;

    if ( my $w = $c->stash->{wrapper} ) {
        $self->template->{SERVICE}->{WRAPPER} = ref $w eq 'ARRAY' ? $w : [$w];
    }

    $self->SUPER::process($c);
}

これをMyApp::View::TTに置きませう。WRAPPERが一つの時は文字列で、複数の時はarray refで。

#Controllerで
$c->stash->{wrapper} = 'another_wrapper.html'; #単数
$c->stash->{wrapper} = ['a.html', 'b.html'];   #複数

とかやったら幸せかなぁと思いました。作った後に思って今更ですけどWrapper変えるってそんなに無いですよね。まぁいいややったことなので。