アルファサード株式会社 代表取締役 野田 純生のブログ


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>

  • 注1) 本当はハッシュとか配列が渡せるといいんだけど。
  • 注2) こんな渡し方だったらグローバルフィルターで分解でも良いのだけれど、コンテナタグ化することによってデザイン担当と分業できるので。


このブログを書いている人
野田純生の写真
野田 純生 (のだ すみお)

大阪府出身。ウェブアクセシビリティエバンジェリスト。 アルファサード株式会社の創業者であり、現役のプログラマ。経営理念は「テクノロジーによって顧客とパートナーに寄り添い、ウェブを良くする」。 プロフィール詳細へ