2005年03月13日

Movable Type プラグイン作成入門(5)

今度は独自のコンテナタグの作り方を見てみよう。

例) --- CSVで与えられたリストでループする。
package MT::Plugin::CsvLoop;
use strict;
use MT::Template::Context;
MT::Template::Context->add_container_tag(CsvLoop=>\&CsvLoop);
sub CsvLoop{
    my($ctx,$arg) = @_;
    my(@list)=split(/,/, $arg->{list});
    my $res = '';
    my $builder = $ctx->stash('builder');
    my $tokens = $ctx->stash('tokens');
    for my $i (@list) {
        $ctx->stash('csv_value', $i);
        defined(my $out=$builder->build($ctx,$tokens))
            or return $ctx->error($ctx->errstr);
        $res .= $out;
    }
    $res;
}

MT::Template::Context->add_tag(CsvLoopValue=>\&CsvLoopValue);
sub CsvLoopValue{
    my $ctx = shift;
    $ctx->stash('csv_value');
}
package MT::Plugin::CsvLoop;
関数などの名前が衝突しないように package を指定。

MT::Template::Context->add_container_tag(CsvLoop=>\&CsvLoop);
MTCsvLoop というコンテナタグがあると CsvLoop という メソッドを呼びだすことを指定。

my($ctx, $arg)=@_;
呼び出されるメソッドには2つの引数が渡される。一つ目はMT::Template::Contextオブジェクト。 2つ目はパラメータのハッシュへのリファランス。

my(@list)=split(/,/, $arg->{list});
テンプレートのコンテナタグ内で list='~' と記述した場合、 $arg->{list} に ~ が入る。
これを "," で区切ったものを @list に代入。

あとは、MT::Template::Contextオブジェクトの内容をまだ理解していないので説明できない。悪しからず。(^^;)

ここで作ったプラグインを CsvLoop.pl という名で保存し、plugins ディレクトリにアップロードしておこう。 これでテンプレート内で コンテナタグの利用は以下のような感じでやれば良い。
<MTCsvLoop list='claudius,nero,galba,otho'>
   <$MTCsvLoopValue$>:
   <a href="<$MTCsvLoopValue$>.html">
     <$MTCsvLoopValue$>.html
   </a>
   <br/>
</MTCsvLoop>
テンプレートの中に固定のループを書いてもあまり役に立たないような気もするが、まあ、サンプルということで。(^^; Posted by augustus at 2005年03月13日 08:38 | TrackBack
Comments
Post a comment









Remember personal info?