Japanese plugin dev 3 2
今までの解説では、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.1 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) if $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には多くのフックポイントが設定されており、config.yamlに設定をすることで機能拡張が可能になります。
フックポイントは大別すると以下のものが存在します。
- オブジェクトの保存、削除、編集
- オブジェクトを参照、保存、削除できるかの権限チェック(フィルタ)
- ページの構築後、ファイル保存後
- ブログ記事やウェブページ、アーカイブなどを出力するかどうかのチェック(フィルタ)
- XML-RPC, Atom API 経由での保存、ファイルや画像のアップロード
- アプリケーションの初期化時、起動開始前、起動終了後
- バックアップ、リストア
- コメント、トラックバック(フィルタ)
- テンプレートセット修正
詳しくは以下のドキュメントをご参考下さい。(英語)
MOVABLETYPE.org : Events and Callbacks in Movable Type: Table of Contents
よく利用するフックポイントのうち、オブジェクトの保存、削除、編集について解説します。
オブジェクトをデータベースに保存する直前に配置されるフックポイントは、 MT::App::CMS::cms_pre_save.(OBJECT_NAME)
となります。
オブジェクトをデータベースに保存した後に配置されるフックポイントは、 MT::App::CMS::cms_post_save.(OBJECT_NAME)
となります。
sub callback_handler { my ($cb, $app, $obj, $org_obj) = @_; # do something }
引数は ($cb, $app, $obj, $org_obj) =>(コールバック、アプリケーション情報、保存後オブジェクト、保存前オブジェクト)を取ります。
オブジェクトの削除後に配置されるフックポイントは、 MT::App::CMS::cms_post_delete.(OBJECT_NAME)
となります。
sub callback_handler { my ($cb, $app, $obj) = @_; # do something }
引数は ($cb, $app, $obj) =>(コールバック、アプリケーション情報、削除対象オブジェクト)を取ります。
オブジェクトの編集前に配置されるフックポイントは、 MT::App::CMS::cms_edit.(OBJECT_NAME)
となります。
sub callback_handler { my ($cb, $app, $id, $obj, $param_ref) = @_; # do something }
引数は ($cb, $app, $id, $obj, $param_ref) =>(コールバック、アプリケーション情報、オブジェクトID、編集対象オブジェクト、編集画面に渡されるパラメータのリファレンス)を取ります。
コールバックのOBJECT_NAMEに指定できる主なオブジェクトは以下になります。オブジェクトによってはフックポイントが設置されていない場合もあります。
author | ユーザー |
website | ウェブサイト |
blog | ブログ |
category | カテゴリ |
folder | フォルダー |
comment | コメント |
ping | トラックバック |
フックポイントとコールバックを利用することで、MTのメインコードの改修なしに機能拡張ができるのが今回のポイントです。
拡張の例としては、コメントが掲載される際にメールで内容を受信したり、ブログ記事を保存する際に未記入部分を補完する、メール送信時にsendmailやSMTP以外の方法で送信するなど、いろいろと考えられます。
ちょっとした機能拡張から、本格的なものまで幅広く利用できます。ぜひトライしてみてください。
- プラグイン開発のためのファーストステップ
- レジストリ、YAMLについて
- 環境変数について
- プラグインのローカライゼーションについて
- テストドリブンでのプラグインの開発について
- グローバル・モディファイアプラグインの開発について
- ファンクションタグ プラグインの開発について
- ブロックタグ プラグインの開発について
- コンディショナルタグ プラグインの開発について
- プラグインのデバッグ
- プラグインの設定方法
- コールバックとフックポイント
- スケジュールタスクの開発
- MTオブジェクトの利用方法
- 独自オブジェクトの作成
- 新規アプリケーションの作成
- Transformerプラグインの開発
- 管理画面のメニュー修正
- リストアクションの追加
- 動作モードの追加とモーダルウィンドウの表示
- 外部Web APIとの連携
- 権限とロール