MT4.xプラグイン作成/transformerプラグイン http://www.ark-web.jp/sandbox/wiki/301.html
Transfromerプラグインとは? †
Transformerプラグインは管理画面を拡張、カスタマイズするプラグインです。MT3.3から対応しています。
MT3.2まではBigAPIプラグインを使って管理画面の拡張を行えた(らしい^^;)
参考:MovableType3.3と4.0の両方に対応したTransformerプラグインの書き方。
Transformerプラグインの作成はMT4.0以前は
MT->add_callback('MT::App::CMS::AppTemplateSource.blog_left_nav', $priority, $plugin, \$code);
のようなコールバック関数のセットを行い、コールバック関数の中で管理画面のテンプレートを正規表現を使って置換していくような【わりと力技】の方法で実現するしかなかったようですが、MT4.0ではこれに加えて、テンプレートをDOMライクに操作して管理画面の拡張を行うことができるようになっているらしいです。
参考:MT4.0, CMSの変化とTransformerプラグイン。、Movable Type v4.0 (Athena): A Developer's Perspective
プラグインの基本構造 †
Transformerプラグインの基本構造は次のようになります。
※ 以下はMT4.0以降に対応するTransformerプラグインで、MT4.0未満のバージョンには対応していません。
# プラグイン名をMySampleとする。 package MT::Plugin::MySample; use strict; use MT; use MT::Template::Context; use vars qw($VERSION); $VERSION = '0.1'; # MT::Plugin::MySampleはMT::Pluginを継承する @MT::Plugin::MySample::ISA = qw(MT::Plugin); # プラグインの管理情報(メタ情報)をセット my $plugin = new MT::Plugin::MySample({ name => 'MySample', # プラグイン名 version => $VERSION, # バージョン description => 'My simple sample plugin', # プラグインの簡単な説明 author_name => 'SHINCHI, Takahiro', # プラグイン作者名 author_link => 'http://www.ark-web.jp/pluginexample/', # 作者のWebサイト doc_link => 'http://www.ark-web.jp/pluginexample/doc/', # プラグインのドキュメントのURL }); MT->add_plugin($plugin); # ↑ここまでで、管理画面のプラグイン一覧にリストされるコードになる。 # (実際にはファイルの末尾に # 1; # という行を追加して、plugins/MySample/ # ディレクトリにsample.plなどの適当な名前で保存する必要がある。 # ファイル名は適当でよいが、ディレクトリ名はプラグイン名と一致する必要がある) # ↓以下がTransformerプラグイン特有の処理 my $priority = 9; # コールバック関数が実行される優先順位を1から10の範囲の数値で指定 my $pagename = ''; # テンプレートファイル名 # コールバック関数の登録 # テンプレート・エンジンが指定したテンプレート・ファイルを読み込んだ際に # 読み込んだテンプレートの内容を変更するコールバック関数の登録 MT->add_callback('MT::App::CMS::template_source.' . $pagename, $priority, $plugin, \&_callback_for_template_source); # テンプレート・エンジンが処理する、表示パラメーターの内容を変更するコールバック関数の登録 MT->add_callback('MT::App::CMS::template_param.' . $pagename, $priority, $plugin, \&_callback_for_template_param); # テンプレート・エンジンが処理した結果を変更するコールバック関数の登録 MT->add_callback('MT::App::CMS::template_output.' . $pagename, $priority, $plugin, \&_callback_for_template_output); # コールバック関数の定義 sub _callback_for_template_source { my ($eh, $app, $tmpl_ref, $tmpl_filename) = @_; # $eh : MT::Callback(コールバックハンドラー) # $app : MT::App::CMSオブジェクト # $tmpl_ref : テンプレート・ファイルの内容(文字列)へのリファレンス # $tmpl_filename : テンプレート・ファイルのファイル名(= $pagename . '.tmpl') } sub _callback_for_template_param { my ($eh, $app, $param_ref, $tmpl_ref) = @_; # $eh : MT::Callback(コールバックハンドラー) # $app : MT::App::CMSオブジェクト # $param_ref : テンプレート・エンジンに渡すパラメータへのハッシュ・リファレンス # $tmpl : MT::Templateオブジェクト } sub _callback_for_template_output { my ($eh, $app, $tmpl_str, $param_ref, $tmpl) = @_; # $eh : MT::Callback(コールバックハンドラー) # $app : MT::App::CMSオブジェクト # $tmpl_str : テンプレート・エンジンが処理した結果文字列の参照(MT::App::CMS->build_pageメソッドの結果文字列への参照) # $param_ref : テンプレート・エンジンに渡すパラメータへのハッシュ・リファレンス # $tmpl : MT::Templateオブジェクト } 1;
Transformerプラグインの発想は
- カスタマイズ対象の管理画面を決め
- 当該管理画面のテンプレート・ファイル名を決定し(というより探し)
- そのテンプレート・ファイルの読み込み時、テンプレート・エンジンにパラメータを渡す時、テンプレート・エンジンの処理結果の出力時にそれぞれ割り込むコールバック関数を設定し
この辺の細かいタイミングに関してはソースを確認していないのでウソがあるかもです^^; - 各々のコールバック関数で、それぞれ上記のタイミングで行いたい処理を差し挟む
というものです。
参考:Transformerプラグインの開発:技術情報提供ブログ
カスタマイズ対象の管理画面と対応テンプレート・ファイル名 †
カスタマイズしたい管理画面にアクセスして、そのURLを確認します。
例えば、ブログ記事の一覧の画面であればURLは
http://~・・・/mt.cgi?__mode=list_entry&blog_id=1
のようになります。このときの__modeの値=[list_entry]から、この画面のテンプレート・ファイルが特定できます。
ある__modeの管理画面のテンプレート・ファイルは次になります。
[MTをインストールしたディレクトリ]/tmpl/cms/[__modeの値].tmpl
上記の例でいえば、
[MTをインストールしたディレクトリ]/tmpl/cms/list_entry.tmpl
となります。
※ 厳密に__modeの値が常にテンプレート名になるわけではないようです。例えば、ブログ編集画面では__mode=viewですが、このテンプレートは/tmpl/cms/edit_entry.tmplになっています
コールバック関数の設定方法と各コールバック関数の用途 †
コールバック関数の設定にはMTクラスのadd_callbackメソッドを使います。
MT->add_callback('MT::App::CMS::template_source.' . $pagename, $priority, $plugin, \&_callback_for_template_source);
第一引数のMT::App::CMS::template_{source|param|output}.[カスタマイズ対象のテンプレート名]で、どのタイミングでどのテンプレートに対してのコールバックを設定するかを指定します。カスタマイズ対象のテンプレート名は[[>./#j049cf7a]]の__modeの値を指定します。
例えば、テンプレート・ファイルの読み込みのタイミングで__mode=list_entryのテンプレートをカスタマイズするコールバック関数を設定するには
MT->add_callback('MT::App::CMS::template_source.list_entry, $priority, $plugin, \&_callback_for_template_source);
とします。
template_source、template_param、template_outputに設定したそれぞれのコールバック関数では以下のような処理を行います。
- template_sourceに結び付けられたコールバック関数
- 第三引数の$tmpl_ref(テンプレート・ファイルの内容(文字列)へのリファレンス)が参照するテンプレート・ファイルの内容を変更する処理を記述する。※ 引数名は任意
- template_paramに結び付けられたコールバック関数
- 第三引数の$param_ref(テンプレート・エンジンに渡すパラメータへのハッシュ・リファレンス)が参照するハッシュの内容を変更する処理を記述する。 ※ 引数名は任意
- template_outputに結び付けられたコールバック関数
- 第三引数の$tmpl_str(テンプレート・エンジンが処理した結果文字列の参照)が参照するテンプレート・エンジンによる処理結果文字列を変更する処理を記述する。 ※ 引数名は任意
DOM ライクな操作による管理画面の拡張 †
Ummm....調査中^^;
コールバック関数内で$tmpl->getElementById("meta-settings");など試してみるも、上手くElementが取れてないもよう。
リファレンスにのっておらず、ソース読むしかないとは・・・Movable Type オブジェクト・リファレンス MT::Template