-
Notifications
You must be signed in to change notification settings - Fork 9
Japanese plugin dev 3 2
Anonymous edited this page Mar 2, 2011
·
15 revisions
今までの解説では、MTタグの拡張により機能を追加する事を取り上げてきました。
今回はコールバックを利用してMTアプリケーション自体を拡張する方法を解説します。
コールバックとは、MTのコードの色々な場面に設置されているフックポイントを「フック」してMTを機能拡張します。
フックポイントはオブジェクトの編集や保存、ページ構築やAPIの操作といった場所に設置されています。
config.yamlでフックポイントと、それを処理するハンドラ関数を指定する事で、コールバックが利用可能になります。
ここでは「ブログ記事の保存後」に設置されているフックポイントを利用してコールバックする例を挙げます。
今回利用するフックポイントは「ブログ記事の保存後」です。実際は cms_post_save.entry という名称で呼ばれるフックポイントです。
- ブログ記事を保存するとフックポイント
cms_post_save.entryが呼ばれる - 新規作成されたブログ記事の場合、ログに “save entry title (ブログ記事ID): ブログ記事タイトル” と保存される
- 既存のブログ記事を保存した場合、ログに “edit entry title (ブログ記事ID): ブログ記事タイトル” と保存される
- ログは「デバッグ」ログとして保存する
id: MyPlugin09
key: MyPlugin09
name: <__trans phrase="Sample Plugin callback">
version: 1.0
description: <__trans phrase="_PLUGIN_DESCRIPTION">
author_name: <__trans phrase="_PLUGIN_AUTHOR">
author_link: http://www.example.com/about/
doc_link: http://www.example.com/docs/
l10n_class: MyPlugin09::L10N
callbacks:
MT::App::CMS::cms_post_save.entry: $MyPlugin09::MyPlugin09::Callbacks::post_save_entry
- MT::App::CMS::cms_post_save.entry
- 今回利用するフックポイント
- ブログ記事(entry)の保存(save)後(post)=>
cms_post_save.entry
- $MyPlugin09::MyPlugin09::Callbacks::post_save_entry
- 今回利用するハンドラ関数
- ($プラグイン名)::(Perlモジュール)::(ハンドラ関数)
package MyPlugin09::Callbacks;
use strict;
sub post_save_entry {
my ($cb, $app, $obj, $org_obj) = @_;
my $id = $obj->id;
my $title = $obj->title;
eval {
if (defined($org_obj->id)) {
doLog("edit entry title ($id): $title");
}
};
if ( $@ ) {
doLog("save entry title ($id): $title");
}
}
sub doLog {
my ($msg, $class) = @_;
return unless defined($msg);
require MT::Log;
my $log = new MT::Log;
$log->message($msg);
$log->level(MT::Log::DEBUG());
$log->class($class);
$log->save or die $log->errstr;
}
1;
- sub post_save_entry {}
- ($cb, $app, $obj, $org_obj) => (コールバック、アプリケーション情報、保存後オブジェクト、保存直前オブジェクト)
- ブログ記事オブジェクトのidとタイトルを取得
- 保存直前オブジェクトのidを確認(新規作成の場合、保存直前にはまだidが設定されていないため)
- idが設定されていた場合、"edit entry title (ブログ記事ID): ブログ記事タイトル"をdoLog関数経由でデバッグログを書き込み
- idが設定されていなかった場合エラーになる(新規作成時)ためevalで囲い、if($@)でエラーをキャッチ
- エラーをキャッチされた場合、"save entry title (ブログ記事ID): ブログ記事タイトル"をdoLog関数経由でデバッグログを書き込み
- sub doLog {}
-
プラグインのデバッグ で紹介したデバッグログ出力関数
- MTのログにログレベル デバッグで情報を保存
- 新規作成の場合、"save entry title (1): 始めてのブログ記事"などと書き込み
- 既存の場合、"edit entry title (1): 始めてのブログ記事"などと書き込み
- MTのログにログレベル デバッグで情報を保存
-
プラグインのデバッグ で紹介したデバッグログ出力関数
以下の手順で処理結果を確認します。
- 新規にブログ記事を作成します。
- 作成したブログ記事を編集し更新します。
- システムメニューから [ツール] > [ログ] を選択します。
- ログの [絞り込み] をクリックし、[レベル] が [デバッグ] のログをフィルタします。

- 新規作成した際のログ
- 「save entry title (16): 今日のスカイタワー西東京」
- 16はブログ記事のID
- 「今日のスカイタワー西東京」はブログ記事のタイトル
- 「save entry title (16): 今日のスカイタワー西東京」
- 修正した際のログ
- 「edit entry title (16): 今日のスカイタワー西東京」
- 16はブログ記事のID
- 「今日のスカイタワー西東京」はブログ記事のタイトル
- 「edit entry title (16): 今日のスカイタワー西東京」
前述したように、MTには多くのフックポイントが設定されています。
フックポイントは大別すると以下のものが存在します。
- オブジェクトの保存、削除、編集
- オブジェクトを参照、保存、削除できるかの権限チェック(フィルタ)
- ページの構築後、ファイル保存後
- ブログ記事やウェブページ、アーカイブなどを出力するかどうかのチェック(フィルタ)
- XML-RPC, Atom API 経由での保存、ファイルや画像のアップロード
- アプリケーションの初期化時、起動開始前、起動終了後
- バックアップ、リストア
- コメント、トラックバック(フィルタ)
- テンプレートセット修正
詳しくは以下のドキュメントをご参考下さい。(英語、将来日本語化される予定あり)
MOVABLETYPE.org : Events and Callbacks in Movable Type: Table of Contents