メソッド stash の働きをまずみてみる。

stashメソッドは MT::Template::Context モジュール(mt/lib/MT/Template/のところにある)に定義されている。stash を通して、テンプレート構築時の情報を引き出したり、独自の情報を保存することができる。

以下はその例。

# キー foo に値を代入する例
$ctx->stash('foo',$value);
# キー foo から値を取出す例
my $value = $ctx->stash('foo');

さて、ここからは複雑なコンテナタグの話。

<コンテナタグ>
テンプレートに以下の通り、コンテナタグ MTSimpleLoop が使えるようにする。なお、MTSimpleLoopIndex はふつうの変数タグ。

<MTSimpleLoop loops="10">
<$MTSimpleLoopIndex$><br />
</MTSimpleLoop>

では、エディタを起動し、以下の通り、プラグインファイル mt-loop.pl を作成し、保存する。

package MT::Plugin::SimpleLoop;
use MT::Template::Context;
MT::Template::Context->add_container_tag(SimpleLoop => \&loop);
MT::Template::Context->add_tag(SimpleLoopIndex => \&loop_index);
sub loop {
    my $ctx = shift;
    my $args = shift;
    my $content = '';
    my $builder = $ctx->stash('builder');
    my $tokens = $ctx->stash('tokens');
    for my $i(1..$args->{loops}) {
        $ctx->stash('loop_index',$i);
        my $out = $builder->build($ctx, $tokens);
        $content .= $out;
    }
    $content;
}
sub loop_index {
    my $ctx = shift;
    return $ctx->stash('loop_index');
}

テンプレートにコンテナタグを挿入して再構築すれば、ブログにループの回数が以下のように表示される。途中経過は省略。

1
2
...
9
10

では、各行をみていこう。

3行目。コンテナタグの登録。
6~18行目。コンテナタグ対応のサブルーチン。
10行目。Builderクラス(MT::Builder) への参照を得る。
11行目。コンテナタグに囲まれた文字列(トークン)への参照を得る。
12~16行目。ループ。繰返し回数は属性loopsで決まる。
13行目。ループカウンターを loop_index に代入。それをサブルーチン loop_index に利用される。
14行目。トークン(文字列)の解決等を Builder に処理してもらい、結果を変数$outに代入。
15行目。変数 $content に連結させる。つまり、ここの例だと、繰り返す度に、$contentに <$MTSimpleLoopIndex$><br /> = $iの値<br /> が後ろに追加される。
17行目。ループ終了時に、$content に 1<br />2<br />…9<br />10<br /> が残る。それがコンテナタグによって囲まれる文字列のインスタンスとなる。

説明はまだまだ判りにくいが、変数タグを利用して、ループ途中の経過を記憶し、ループ終了後に表示させるともっと理解するかもしれない。

Comments are closed.

Post Navigation