Skip to content

Japanese plugin dev 3 2

uehatsu edited this page May 12, 2011 · 15 revisions

コールバックとフックポイント

はじめに

今までの解説では、MTタグの拡張により機能を追加する事を取り上げてきました。

今回はコールバックを利用してMTアプリケーション自体を拡張する方法を解説します。

コールバック、フックポイントとは?

コールバックとは、MTのコードの色々な場面に設置されているフックポイントを「フック」してMTを機能拡張します。

フックポイントはオブジェクトの編集や保存、ページ構築やAPIの操作といった場所に設置されています。

config.yamlでフックポイントと、それを処理するハンドラ関数を指定する事で、コールバックが利用可能になります。

単純なコールバックの例

ここでは「ブログ記事の保存後」に設置されているフックポイントを利用してコールバックする例を挙げます。

仕様

今回利用するフックポイントは「ブログ記事の保存後」です。実際は cms_post_save.entry という名称で呼ばれるフックポイントです。

  1. ブログ記事を保存するとフックポイント cms_post_save.entry が呼ばれる
  2. 新規作成されたブログ記事の場合、ログに “save entry title (ブログ記事ID): ブログ記事タイトル” と保存される
  3. 既存のブログ記事を保存した場合、ログに “edit entry title (ブログ記事ID): ブログ記事タイトル” と保存される
  4. ログは「デバッグ」ログとして保存する

config yaml

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モジュール)::(ハンドラ関数)

Callbacks.pm

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): 始めてのブログ記事"などと書き込み

処理結果

以下の手順で処理結果を確認します。

  1. 新規にブログ記事を作成します。
  2. 作成したブログ記事を編集し更新します。
  3. システムメニューから [ツール] > [ログ] を選択します。
  4. ログの [絞り込み] をクリックし、[レベル] が [デバッグ] のログをフィルタします。

  • 新規作成した際のログ
    • 「save entry title (16): 今日のスカイタワー西東京」
      • 16はブログ記事のID
      • 「今日のスカイタワー西東京」はブログ記事のタイトル
  • 修正した際のログ
    • 「edit entry title (16): 今日のスカイタワー西東京」
      • 16はブログ記事のID
      • 「今日のスカイタワー西東京」はブログ記事のタイトル

フックポイント

前述したように、MTには多くのフックポイントが設定されており、config.yamlに設定をすることで機能拡張が可能になります。

主なフックポイント

フックポイントは大別すると以下のものが存在します。

  1. オブジェクトの保存、削除、編集
  2. オブジェクトを参照、保存、削除できるかの権限チェック(フィルタ)
  3. ページの構築後、ファイル保存後
  4. ブログ記事やウェブページ、アーカイブなどを出力するかどうかのチェック(フィルタ)
  5. XML-RPC, Atom API 経由での保存、ファイルや画像のアップロード
  6. アプリケーションの初期化時、起動開始前、起動終了後
  7. バックアップ、リストア
  8. コメント、トラックバック(フィルタ)
  9. テンプレートセット修正

詳しくは以下のドキュメントをご参考下さい。(英語)

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

コールバックのOBJECT_NAMEに指定できる主なオブジェクトは以下になります。オブジェクトによってはフックポイントが設置されていない場合もあります。

author ユーザー
website ウェブサイト
blog ブログ
category カテゴリ
folder フォルダー
comment コメント
ping トラックバック

まとめ

フックポイントとコールバックを利用することで、MTのメインコードの改修なしに機能拡張ができるのが今回のポイントです。

拡張の例としては、コメントが掲載される際にメールで内容を受信したり、ブログ記事を保存する際に未記入部分を補完する、メール送信時にsendmailやSMTP以外の方法で送信するなど、いろいろと考えられます。

ちょっとした機能拡張から、本格的なものまで幅広く利用できます。ぜひトライしてみてください。

プラグインダウンロード

MyPlugin09.zip(2.30KB)

プラグイン開発ガイド インデックス

  1. プラグイン開発のためのファーストステップ
  2. レジストリ、YAMLについて
  3. 環境変数について
  4. プラグインのローカライゼーションについて
  5. テストドリブンでのプラグインの開発について
  6. グローバル・モディファイアプラグインの開発について
  7. ファンクションタグ プラグインの開発について
  8. ブロックタグ プラグインの開発について
  9. コンディショナルタグ プラグインの開発について
  10. プラグインのデバッグ
  11. プラグインの設定方法
  12. コールバックとフックポイント
  13. スケジュールタスクの開発
  14. MTオブジェクトの利用方法
  15. 独自オブジェクトの作成
  16. 新規アプリケーションの作成
  17. Transformerプラグインの開発
  18. 管理画面のメニュー修正
  19. リストアクションの追加
  20. 動作モードの追加とモーダルウィンドウの表示
  21. 外部Web APIとの連携
  22. 権限とロール
Clone this wiki locally