Transformerプラグインの作成方法

Movable Type 3.3では、管理画面のカスタマイズを行う際には、従来のBIGPAPIに代わって、「Transformer」というタイプのプラグインを使います。
アメリカのMovable Typeのフォーラムに、BIGPAPI作者のKevin Shai氏が、BIGPAPI対応のRightFieldプラグインをTransformer対応に書き換えたものがありましたので、それを元に、Transformerプラグインの作り方を調べてみました。
従来のBIGPAPIのプラグインを少し書き換えるだけで済みそうです。

1.プラグインの登録

TransformerプラグインをMTに登録するには、プラグインの中に以下のような行を入れます。
「テンプレート名」の部分には、書き換えるテンプレートのファイル名から拡張子を取ったものを指定します。
例えば、「edit_entry.tmpl」を書き換える場合、テンプレート名の部分に「edit_entry」を入れます。

MT->add_callback('MT::App::CMS::AppTemplateSource.テンプレート名', 9, $plugin, \&書き換えを行うサブルーチン);

2.書き換えを行うサブルーチン

テンプレートの書き換えを行うサブルーチンは、従来のBIGPAPIと同じ要領で作ります。
テンプレートの中から書き換えたい部分を検索し、置換する処理を行います。

サブルーチンには「cb」「app」「template」の3つの引数が渡されます。
最後の「template」を介して、置換の処理を行うことができます。

3.プラグインの例

Transformerプラグインの簡単な例として、個々のBlogのメニューに、そのBlogのエントリーの数を表示するものを作ってみました(赤枠で囲んだ部分が動作の例)。

↓プラグインの動作画面の例
プラグインの動作画面の例

プラグインのソースは以下の通りです。
このソースをコピーし、「TransformerTest.pl」という名前で保存して、Movable Typeの「plugins」ディレクトリにアップロードします。

package MT::Plugin::TransformerTest;
use strict;

use base qw( MT::Plugin );

require MT::Plugin;
require MT;

my $plugin = MT::Plugin::TransformerTest->new({
    'name' => 'TransformerTest',
    'author_name' => 'H.Fujimoto',
    'author_link' => 'http://www.h-fj.com/blog/',
    'description' => 'Transformer plugin test.',
    'version' => '1.00',
});
MT->add_plugin($plugin);

MT->add_callback('MT::App::CMS::AppTemplateSource.menu', 9, $plugin, \&edit_menu_template);

sub edit_menu_template {
    my ($cb, $app, $template) = @_;

    my $blog_id = $app->{query}->param('blog_id');
    my $entry_count = MT::Entry->count({ blog_id => $blog_id });

    my $old = <<HERE;
<p class="page-desc"><MT_TRANS phrase="Here is an overview of [_1]." params="<TMPL_VAR NAME=BLOG_NAME ESCAPE=HTML>"></p>
HERE
    $old = quotemeta($old);
    my $new = <<HERE;
<p class="page-desc"><MT_TRANS phrase="Here is an overview of [_1]." params="<TMPL_VAR NAME=BLOG_NAME ESCAPE=HTML>"></p>
<p class="page-desc">Number of entries : $entry_count</p>
HERE
    $$template =~ s/$old/$new/;
}

1;

4.paramタイプのプラグイン

BIGPAPIでは、「param」というタイプのプラグインを作ることができました。
Transformerプラグインでも、同じタイプのプラグインを作ることができます。
こちらの作り方はまだ調べていませんが、これもBIGPAPIとほとんど同じと思われます。