過去に色々とMovableTypeのプラグインを作ってきた経験から、その知識を記事として整理しておくのは良いことかも知れません。独学+トライ&エラーで得られたモノばかりで、かなりアレゲ(?)な内容ですが、これからプラグインを作ってみよう!という方の一助になれば幸いです。
できるだけサンプルコードを多用して説明するよう心がけていますが、筆者がひっじょーに説明下手な上に、勘違いをそのままに暴走する人なので、チンプンカンプンだったらゴメンなさい orz
MT::Plugin クラスを利用して作ります。MT 本体との間にある小難しい取り決めは MT::Plugin クラスが賄ってくれるので、開発者はプラグインの実装に専念することができます。
package MT::Plugin::myplugin_1_1;
use base qw( MT::Plugin );
my $plugin = new MT::Plugin ({
name => 'My First Plugin',
version => '1.00',
doc_link => 'http://www.example.com/',
author_name => 'Piroli YUKARINOMIYA',
author_link => 'http://www.magicvox.net/home.php',
plugin_link => 'http://www.example.com/',
description => <<HTMLHEREDOC,
Describe the brief explanations of your plugin.<br />
Describe the brief explanations of your plugin.<br />
Describe the brief explanations of your plugin.<br />
HTMLHEREDOC
});
MT->add_plugin ($plugin);
1;
package MT::plugin::myplugin_1_1;
use base qw( MT::Plugin );
MT::Plugin クラスを
継承
したサブクラスを作ることの宣言です。
このプラグインの中で口出しする部分(独自の機能定義)はあるけれど、
それ以外の何も言わないところは、MT::Plugin 側で何とかしてね♪と言うこと。
$plugin = new MT::Plugin
name
version (3.2以降)
doc_link
author_name (3.2以降)
author_link (3.2以降)
author_name のリンク URL を定義します。
個人や組織のウェブサイトに誘導するのに役立ちます。
plugin_link (3.2以降)
description
doc_link や plugin_link を利用して詳細な解説ページに誘導するのが好ましいかと思います。MT->add_plugin ($plugin);
1;
<MTDate> や<MTBlogName> のように、
そのテンプレートタグが何らかの値や文字列に置き換えられるものです。<MTCalendarDay> などのように、特定のコンテナタグ内部でしか使われない変数タグがありますが、これは次回以降、コンテナタグの説明の回に任せます。
ここでは簡単な例として、再構築の度に 1 から 6 の任意の整数に置き換えられて、
サイコロの様に振舞う変数タグ<MTDice>を作ってみます。
先ほどと同様に、以下の内容で myplugin_1_2.pl というファイルを作り、
MT の plugins フォルダにコピーしてください。
package MT::Plugin::myplugin;
use base qw( MT::Plugin );
my $plugin = new MT::Plugin ({
name => 'one of the Dice',
description => <<HTMLHEREDOC,
Give a random integer like one of the dice.
HTMLHEREDOC
});
MT->add_plugin ($plugin);
use MT::Template::Context;
MT::Template::Context->add_tag (Dice => sub { int (rand 6) + 1 });
1;
そして、適当なテンプレート中に <$MTDice$> タグを追加し、そのテンプレートを再構築してみます。
再構築されたファイルをブラウザで開くと、テンプレートタグを埋め込んだ場所に、1 から 6 の任意の整数が表示されるはずです。
use MT::Template::Context;
MT::Template::Context->add_tag (Dice => sub { int (rand 6) + 1 });
MTDice」で、
その処理内容は「0 以上 6 未満の乱数(rand 6)の整数部分(int)に 1 を足す」と云うことです。
package MT::Plugin::myplugin;
use base qw( MT::Plugin );
my $plugin = new MT::Plugin ({
name => 'one of the Dice',
description => <<HTMLHEREDOC,
Give a random integer like one of the Dice.
HTMLHEREDOC
});
MT->add_plugin ($plugin);
use MT::Template::Context;
MT::Template::Context->add_tag (Dice => &dice);
sub dice {
# 複雑な処理 1
# 複雑な処理 2
# 複雑な処理 3
int (rand 6) + 1;
}
1;
<MTDice>タグはサイコロを一つだけ振ることができましたが、
サイコロを二つ三つ...と振れるように改造してみましょう。サイコロの数は
<$MTDice num="3"$>
のように指定できるようにします。それが以下のプログラムコードです(myplugin_1_3.pl)。
package MT::Plugin::myplugin;
use base qw( MT::Plugin );
my $plugin = new MT::Plugin ({
name => 'Dice',
description => <<HTMLHEREDOC,
Give some random integers like dice.
HTMLHEREDOC
});
MT->add_plugin ($plugin);
use MT::Template::Context;
MT::Template::Context->add_tag (Dice => &dice);
sub dice {
my ($ctx, $args) = @_;
my $num = $args->{num} || 1;
my @eye = ();
while ($num--) { push @eye, int (rand 6) + 1; }
join '-', @eye;
}
1;
そして先ほどのテンプレート中の <MTDice> タグに
num="3"を追記して、そのテンプレートを再構築してみます。
再構築されたファイルをブラウザで開くと、テンプレートタグを埋め込んだ場所に、"5-3-6"などの数字がランダムに表示されるはずです。
my ($ctx, $args) = @_;
my $num = $args->{num} || 1;
my @eye = ();
while ($num--) { push @eye, int (rand 6) + 1; }
join '-', @eye;
$ctx という変数に格納されているので、
これを使用してデータにアクセスすることになります。<$MTBlogName$> と同じ動作をする
<$MTMyBlogName$>変数タグのプログラムは次のようになります。
package MT::Plugin::myplugin;
use base qw( MT::Plugin );
my $plugin = new MT::Plugin ({
name => 'MyBlogName',
description => <<HTMLHEREDOC,
This is a clone of MTBlogName.
HTMLHEREDOC
});
MT->add_plugin ($plugin);
use MT::Template::Context;
MT::Template::Context->add_tag (MyBlogName => &my_blog_name);
MT::Template::Context->add_tag (ListContext => &list_ctx);
sub my_blog_name {
my ($ctx, $args) = @_;
my $blog = $ctx->stash('blog');
$blog->name;
}
sub list_ctx {
my ($ctx, $args) = @_;
use Data::Dumper;
Dumper ($ctx);
}
1;
my $blog = $ctx->stash('blog');
$blog->name;
$ctx から、どのようなデータにアクセスできるのか、その一覧を見るには、
このプラグインで定義された<MTListContext>変数タグを使ってみてください。$ctx の中身をずらずらっとダンプしてくれるので(dump_context.txt)、
どのようなデータが含まれているか調べることができます。
これを見ると、ブログの設定やエントリの投稿日など、殆んど全ての情報を扱うことができるとわかるでしょう。
これらのデータを如何に扱うか、そこは貴方の考え次第です。
寄せられたコメント (全 1 件中、最新 5 件まで表示しています)
わたしもプラグインを作ってみたいと思って徘徊していたらこちらに行き着きました。
とっても分かりやすい説明です。
<MTListContext>変数タグをトップページとエントリページで表示させてみたところ、内容が異なるんですね。
MT のタグによっては、コンテナタグを使用しないとエラーする意味が分かりました!!
第2回〜も読ませていただきます。