MovableType を開発プラットフォームとして使う (Part2)。
公開日 : 2007-04-22 12:32:15
MovableType をテンプレートエンジンとして使って動的なページを作成する方法の例。
以下のエントリーの例で説明。※エラー処理等は省略。
/mt/lib/MT/Myapp.pm
タブ区切りテキスト(別にどんなフォーマットでも良いけど[注1])を $entry>text に渡して1行毎にコンテナタグ[注2]のループから取り出す。
$blog, $authorを取得しておくか生成しておいて、MT::Entry オブジェクトを生成してページをビルドする (動的ページ生成のためのオブジェクトなので保存はしない) 。
my $title = 'Title';
my $text =<<LIST;
http://example.com/1.html Example1
http://example.com/2.html Example2
http://example.com/3.html Example3
LIST
# エントリーの生成
use MT::Entry;
my $entry = MT::Entry->new;
$entry->blog_id($blog->id);
$entry->author_id($author->id);
$entry->status(1);
$entry->convert_breaks(0);
$entry->title($title);
$entry->text($text);
# テンプレートの読み込み
use MT::Template;
my $tmpl_name = 'MyExampleTemplate';
my $template = MT::Template->load({
blog_id=>$blog->id,
name=>$tmpl_name,
});
$template = $template->text;
# エントリーのビルド
my $ctx = MT::Template::Context->new;
$ctx->stash('entry', $entry);
$ctx->stash('blog', $blog);
$ctx->stash('blog_id', $blog->id);
my $build = MT::Builder->new;
my $tokens = $build->compile($ctx, $template);
my $html = $build->build($ctx, $tokens);
return $html;
/mt/plugin/Myapp.pl
# 前段は省略
MT::Template::Context->add_container_tag(MyContainer => \&_my_container);
MT::Template::Context->add_tag(MyURI => \&_my_uri);
MT::Template::Context->add_tag(MyLabel => \&_my_label);
MT::Template::Context->add_conditional_tag(IfMyOdd => \&_my_odd);
# <MTMyContainer>~</MTMyContainer>
sub _my_container {
my ($ctx, $args, $cond) = @_;
my $tokens = $ctx->stash('tokens');
my $builder = $ctx->stash('builder');
my $blog_id = $ctx->stash('blog_id');
my $entry = $ctx->stash('entry');
my $text = $entry->text;
my @items = split(/\n/, $text);
my $res = '';
my $i = 1;
foreach my $item (@items) {
my @splitem = split(/\t/, $item);
local $ctx->{__stash}{'uri'} = $splitem[0];
local $ctx->{__stash}{'label'} = $splitem[1];
local $ctx->{__stash}{'num'} = $i;
my $out = $builder->build($ctx, $tokens, $cond);
$res .= $out;
$i++;
}
$res;
}
# <$MTMyURI$>
sub _my_uri {
my ($ctx, $args, $cond) = @_;
$ctx->stash('uri');
}
# <$MTMyLabel$>
sub _my_label {
my ($ctx, $args, $cond) = @_;
$ctx->stash('label');
}
# <MTIfMyOdd>~<MTElse>~</MTElse></MTIfMyOdd>
sub _my_odd {
my ($ctx, $args, $cond) = @_;
my $num = $ctx->stash('num');
$num % 2;
}
1;
MyExampleTemplate
管理画面からアーカイブテンプレートとして登録。
<h1><$MTEntryTitle$></h1> <ol> <MTMyContainer> <li <MTIfMyOdd>class="odd"<MTElse>class="even"</MTElse></MTIfMyOdd>><a href="<$MTMyURI$>"><$MTMyLabel$></a></li> </MTMyContainer></ol>
出力結果
<h1>Title</h1> <ol> <li class="odd"><a href="http://example.com/1.html">Example1</a></li> <li class="even"><a href="http://example.com/2.html">Example2</a></li> <li class="odd"><a href="http://example.com/3.html">Example3</a></li> </ol>