Sync A World You Want To Explore

関 信浩が2002年から書き続けるブログ。ソーシャルメディア黎明期の日本や米国の話題を、元・記者という視点と、スタートアップ企業の経営者というインサイダーの立場を駆使して、さまざまな切り口で執筆しています

Movable Typeでは新規blogを作ると、MTデフォルトのテンプレートが自動的に作成されてしまいます。例えばひとつのMTで複数のblogを立ち上げる場合、毎回毎回同じ修正を施さなければいけません。

細かな修正なら、default-templates.plを直接エディットすれば済みますが、新たにテンプレートなどを追加している場合は、面倒このうえありません。

そこでShowTemplatesプラグインを使って、default-templates.plを自動作成する方法を紹介します。

主な手順:
ShowTemplatesプラグインを入手
・以下のパッチを当てる
default-templates.plという名前のテンプレート(以下)を登録
・rebuildするとdefault-templates.plがblogのディレクトリーにできます

一つのMTで複数のblogを作っている場合は、テンプレート管理用のblogを一つ作成し、デフォルト設定にしたいテンプレートに修正・登録しておくとラクでしょう。

---
以下、少しだけ技術的なことを。

・ShowTemplatesにはrebuild_meのパラメーターがないので追加
・テンプレート中の「'」は明示的にエスケープ(\')してやらないといけない

default-templates.plは eval {$xxx = require 'default-templates.pl'}されるので、charsetの違いや改行コードなどにも気をつける必要あり。

ということで、ShowTemplatesに新たにMTShowTemplateEscapedTextというタグを作りました。「'」を「\'」とエスケープしたMTShowTemplateTextです。

例えば登録されている全テンプレートを表示するテンプレート(templates.html)はこんな感じになるでしょう。

<textarea cols="75" name="text" rows="15"> [ <MTShowTemplates blog_id="1" name="all"> { 'text' => '<$MTShowTemplateEscapedText$> ', 'outfile' => '<$MTShowTemplateOutfile$>', 'rebuild_me' => '<$MTShowTemplateRebuildMe$>', 'type' => '<$MTShowTemplateType$>', 'name' => '<$MTShowTemplateName$>' }, </MTShowTemplates> ] </textarea>

またMTShowTemplateからのdiffは、

8,9c8,9
< my $start_wrap = '<textarea cols="75" name="text" rows="15" wrap="virtual" sty
le="background-color: #eee;">';
< my $end_wrap = '</textarea>';
---
> my $start_wrap = '';
> my $end_wrap = '';
17a18,19
> MT::Template::Context->add_tag(ShowTemplateRebuildMe => sub { &_hdlr; });
> MT::Template::Context->add_tag(ShowTemplateEscapedText => sub { &_hdlr; });
34a37
> # my $escape = $args->{escape} if defined($args->{escape});
43,44c46,48
< my $text = $start_wrap.encode_entities($template->text).$end_wrap;
<
---
> ## HTML::Entities doesn't work well for unicode, for '<>&"' provided
> my $text = $start_wrap.encode_entities($template->text, '<>&"').$end_wrap;
> my $escapedtext = join "\\\'", split /'/i, $template->text;
48c52
< $item = { id => $template->id,
---
> $item = { id => $template->id,
52c56,58
< outfile => $outfile,
---
> outfile => $outfile,
> rebuild_me => $template->rebuild_me,
> escapedtext => $escapedtext,
63a70
> $ctx->stash ('mt-showtemplate_rebuildme', $show->{rebuild_me});
64a72
> $ctx->stash ('mt-showtemplate_escapedtext', $show->{escapedtext});


default-templates.plというファイル名で、以下のテンプレートを登録してください(Index Templateとして作ってください)

[ <MTShowTemplates name="all"> { 'text' => '<$MTShowTemplateEscapedText$> ', 'outfile' => '<$MTShowTemplateOutfile$>', 'rebuild_me' => '<$MTShowTemplateRebuildMe$>', 'type' => '<$MTShowTemplateType$>', 'name' => '<$MTShowTemplateName$>' }, </MTShowTemplates> ]

---
現時点では、その他のTemplateが読み込まれないという不具合あり。
フォーマット的には問題ないと思われるのですが…

→ index,custom,archive,category,individual以外のテンプレート(コンソール画面で「EDIT」というボタンが出るテンプレート。Comment Listing Templateなど)は、一度セーブしてやらないとMTShowTemplatesで表示されないことが判明。それもMTShowTemplatesのバグでなく、MovableTypeの仕様の模様?

(詳細は
lib/MT/App/CMS.pm
で$type eq 'template'がある行を探すと分かる?)