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