MovableType プラグインの作り方 - 第1回:はじめに

Posted by
ぴろり
Posted at
2006/03/28 23:24
Trackbacks
関連記事 (1)
Comments
コメント (1)
Post Comment
コメントできます
Category
MovableType カテゴリ

 過去に色々とMovableTypeのプラグインを作ってきた経験から、その知識を記事として整理しておくのは良いことかも知れません。独学+トライ&エラーで得られたモノばかりで、かなりアレゲ(?)な内容ですが、これからプラグインを作ってみよう!という方の一助になれば幸いです。
 できるだけサンプルコードを多用して説明するよう心がけていますが、筆者がひっじょーに説明下手な上に、勘違いをそのままに暴走する人なので、チンプンカンプンだったらゴメンなさい orz

このエントリーをはてなブックマークに追加  

目次

 一度では全て書き切れないので、幾つかの連載記事とする予定です。 MovableType のヘルプドキュメント にある内容を網羅し、これに沿った形で書いていくつもりですので、併せて読み進めていただけるとモア・ベターかと思います。 よろしくお付き合いくださいませm(_ _)m

プラグインの雛型

 ほとんどのプラグインは MT::Plugin クラスを利用して作ります。MT 本体との間にある小難しい取り決めは MT::Plugin クラスが賄ってくれるので、開発者はプラグインの実装に専念することができます。
 以下の内容で myplugin_1_1.pl というファイルを作り、MT の plugins フォルダにコピーするだけです。MT の管理画面から[プラグイン]と辿ることで、作ったプラグインを確認することができます。
 ちなみに今の段階では、このプラグインは一覧に表示されているだけで、実際には何の機能も持っていません。
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
MT プラグインの入れ物を作ります。 この段階では、入れ物しか無いので、その名前も、何をするためのプラグインかさえも定義されていない状態です。 以下に続く。
name
このプラグインの名前を定義します。 下の図の"My First Plugin"と書かれた部分で、あなたのセンスが問われる大事な部分です(大きなお世話)
version (3.2以降)
このプラグインのバージョン番号を定義します。 下の図では"1.00"と書かれた部分(前の"バージョン"は含まれない)で、 機能追加やバグ修正を行った場合は忘れずに変更しておくと、後々、幸せになれます。
doc_link
このプラグインのドキュメントへのリンク URLを定義します。 相対パスと絶対パスの何れかを指定できます。 相対パス指定の場合は、myplugin_1_1.pl のあるディレクトリが基準になります。
author_name (3.2以降)
このプラグインの作者の名前を定義します。 下の図で"Piroli YUKARINOMIYA"と書かれた部分で、あなたの名前か、所属する組織名が入るでしょう。
author_link (3.2以降)
上の author_name のリンク URL を定義します。 個人や組織のウェブサイトに誘導するのに役立ちます。
plugin_link (3.2以降)
このプラグインのホームへのリンク URL を定義します。 プラグイン専用のウェブページがある場合、そこへ誘導するのに役立ちます。
description
下の図では"description"部分のように、このプラグインの簡単な説明文を記述できます。ここでは概要説明程度に留め、doc_linkplugin_link を利用して詳細な解説ページに誘導するのが好ましいかと思います。
MT->add_plugin ($plugin);
上で定義した内容のプラグインを、MT のプラグインとして追加するための処理です。 実は無くても動く場合があります。 が、プラグイン一覧に表示されなくなるので、ちょっぴり損した気分です。
1;
Perl のおまじないです(笑 プラグインの最終行に忘れずに書いておきます。 プログラムの他の部分が全て正しくても、この 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 を足す」と云うことです。
 これは 1 から 6 の整数を返すだけの簡単な処理でしたが、もっと複雑な処理を行う場合など、 これではプログラムがぐちゃぐちゃになってしまうことがあります。 そこで以下のように、処理部分を別に サブルーチン として定義しておき、これを用いるよう指定することができます(myplugin_1_2a.pl)。 将来の機能拡張を考えて、最初からこの様式で書いておくと便利です。
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;
変数タグに与えられた引数にアクセスするには、この $args を使用します【←ここ重要】  この例では変数タグの num="..." で指定された値を取得して $num に代入します。 num が指定されていなかった時は 1 が代入されます。
my @eye = ();
サイコロの出目を記憶するための空の配列を用意しています。
while ($num--) { push @eye, int (rand 6) + 1; }
$num 回だけサイコロを振り、その出目を @eye に覚えておきます。
join '-', @eye;
@eye に覚えておいたサイコロの出目をハイフン(-)で区切って返します。

ブログデータを扱う変数タグ

 ここまで変数タグの説明として、ブログとは関係のない動作を行うものばかりでしたが、 エントリやコメントなど、ブログの様々なデータを扱うことも勿論可能です(むしろこちらが本命)。 ブログのデータは、$ctx という変数に格納されているので、 これを使用してデータにアクセスすることになります。
 例えば、MT の標準テンプレートタグである <$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');
 現在のコンテクストが含まれるブログへの参照を取得します。 stash は、おまじないで(これ多いな)
$blog->name;
現在のブログの名前を取得します。

 $ctx から、どのようなデータにアクセスできるのか、その一覧を見るには、 このプラグインで定義された<MTListContext>変数タグを使ってみてください。$ctx の中身をずらずらっとダンプしてくれるので(dump_context.txt)、 どのようなデータが含まれているか調べることができます。
 これを見ると、ブログの設定やエントリの投稿日など、殆んど全ての情報を扱うことができるとわかるでしょう。 これらのデータを如何に扱うか、そこは貴方の考え次第です。

サンプルファイルのダウンロード

 この記事で使用したプラグインのプログラムコードを ダウンロードできます。
このエントリーをはてなブックマークに追加  


この記事を読んだ人はこんな記事も読んでいます記事リコメンデーションについて

カバー画像:MovableType プラグインの作り方 - 第2回:コンテナタグ

関連記事/トラックバック (全 1 件中、最新 5 件まで表示しています)

web by okworld のスクリーンショット
タイトル
Movable Type3.3のプラグインを作る
Trackbacked at
2006/07/23 03:13
from
web by okworld
概要
別管理のブログの改造について(Movable Type3.3)・・ カテゴリページの上段部分にそれぞれ違ったコンテンツを掲載したいなーと思って色々なサイトを探し...

この記事にトラックバックを送るには?

寄せられたコメント (全 1 件中、最新 5 件まで表示しています)

Posted by
bzbellbzbell
at
2006/05/08 11:35
ID
H9EvngGU
こんにちわ^^
わたしもプラグインを作ってみたいと思って徘徊していたらこちらに行き着きました。
とっても分かりやすい説明です。
<MTListContext>変数タグをトップページとエントリページで表示させてみたところ、内容が異なるんですね。
MT のタグによっては、コンテナタグを使用しないとエラーする意味が分かりました!!
第2回〜も読ませていただきます。

コメントを投稿する

 
 (必須, 匿名可, 公開, トリップが使えます)
 (必須, 匿名可, 非公開, Gravatar に対応しています)
 (必須)
スパム コメント防止のため「投稿確認」欄に ランダムな数字 CAPTCHAについて を入力してから送信してください。お手数ですがご協力のほど宜しくお願いいたします。