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>