Japanese plugin dev 1 1
yuji edited this page Oct 27, 2011
·
17 revisions
今回は、プラグイン開発のファーストステップとして、プラグインの開発の全体像を紹介します。
プラグインは、特定の機能や限定された機能をMovable Typeに追加する小さなソフトウェアです。Movable Typeのプラグインには、主に次の種類があります。
- ファンクションタグ プラグイン
- 標準で提供されているテンプレートタグを拡張したり、他システムからのデータを取得するテンプレートタグを追加できます。たとえば、GoogleやYahoo!が提供するAPIを利用し、該当のエントリーに関連する検索結果をエントリーに埋め込むことができます。
- ブロックタグ プラグイン
- Movable Typeには複数回にわたって動作するブロックタグがあります。MT::Entryなどを複数取得しそこから特定の値だけを抽出して出力するなどの機能を追加できます。
- コンディショナルタグ プラグイン
- Movable Typeには、MTブロックタグに条件分岐機能を追加するコンディショナルタグがあります。これらのコンディショナルタグを追加、拡張する事でブログ記事などを出力する際に、出力に条件分岐の機能を追加できます。
- グローバルモディファイア プラグイン
- Movable Typeには、dirifyやpadのように様々なグローバルモディファイアが用意されています。これらのグローバルモディファイアを追加、拡張する事でテンプレートタグにフィルタリングなどの機能を追加できます。
- Transformer プラグイン
- たとえば、CustomFieldsプラグインのように、管理画面をカスタマイズし、独自の機能を追加できます。
- スパム フィルター プラグイン
- SpamLookupプラグインのように、独自の判断基準による迷惑コメント/トラックバックの処理を追加できます。
プラグインのディレクトリ構造は、Movable Typeのそれをベースにしています。MyPluginというプラグインを例に、ディレクトリ構造を整理してみましょう。(MTがインストールされている場所を"$MT_DIR"とします)
$MT_DIR/ |__ plugins/ | |__ MyPlugin/ | |__ config.yaml | |__ my_plugin.cgi | |_ t/ | | |_plugin_test.t | |__ lib/ | | |__ MyPlugin.pm | |__ tmpl/ | | |__ config.tmpl | |__ php/ | |__ function.my_plugin.php | |__ mt-static/ |__ plugins |__ MyPlugin/ |__ styles.css |__ images/ | |__ logo.jpg |__ js/ |__ myplugin.js
- プラグインスクリプト
- アプリケーションディレクトリの下の plugins ディレクトリに、スクリプトを格納するディレクトリを作成し、その中にプラグインスクリプトを設定します。このpluginsディレクトリは、環境変数PluginPathで自由に変更ができます。また、各種クラスライブラリを格納する lib ディレクトリや、画面表示のためのテンプレートファイルを格納する tmpl ディレクトリを、本ディレクトリの下に用意します。
- スタティックファイル
- 画像やスタイルシート、JavaScriptなどのスタティックファイルは、StaticWebPathで指定されたディレクトリ(標準はmt-static)の下の plugins ディレクトリに、プラグインの名前と同じディレクトリを作成し、その中にプラグインスクリプトを設定します。
- ダイナミックパブリッシング対応スクリプト
- プラグインがダイナミックパブリッシングをサポートする場合、アプリケーションディレクトリの下の plugins/MyPlugin/php/ ディレクトリに、smartyに対応したファイル名でプラグイン・スクリプトを設定します。
- テストファイル
- テストドリブンの開発を行うために、まずテストを書いて、テストを通すためにコードを書きます。そのテストファイルは、アプリケーションディレクトリの下の plugins/MyPlugin/t/ などに配置します。
プラグインの開発は、次の手順でおこないます。
- 作成したYAMLファイルを、 config.yaml という名前で保存します。スクリプトの保存先は、プラグインの名前からわかりやすいディレクトリ(例: MyPlugin)にします。前述のディレクトリ構造を参照してください。
- 実装される項目をテストするための、 テストファイル を作成します。
- Movable TypeのAPIリファレンスを参考に、 Perlスクリプト を記述します。Movable TypeのAPIリファレンスは、perldoc形式でスクリプトに格納されており、次の例のように画面に表示できます。
$ cd lib
$ perldoc MT.pm
また、以下のサイトでも公開しています。(日本語版リファレンスは内容が古いため、更新版を順次公開する予定です。) - Perlスクリプトをテスト します。テストがうまく行かない場合、「テストスクリプトが間違っている場合」と「Perlスクリプトが間違っている場合」の両方がありますので、双方のスクリプトのチェックをし修正した上で再度テストを行ってください。
- プラグインがテンプレートタグやテキストフィルターの場合は、ダイナミックパブリッシングをサポートするために、 PHPスクリプト も記述します。作成したスクリプトは、phpディレクトリに保存しましょう。
- 画像やスタイルシート、操作マニュアルや制限事項等を記載したリリースノート等を用意します。 操作マニュアルやリリースノート は、プラグインを利用する方にとってとても重要なものです。しっかり、準備しましょう。
- 配布用のパッケージ を作成します。ディレクトリ構造を含めて、tar.gz形式またはzip形式に圧縮しましょう。
Movable Type 3.2からプラグインの管理が容易になりました。プラグインをプラグインディレクトリに配置する事で自動的に各プラグインを登録され、実行の可否を管理画面で設定できるようになります。
はじめて作るプラグインは、この プラグインの登録 のみをおこなうプラグインです。
$MT_DIR/plugins/(プラグイン名)/config.yaml という形でファイルを作成します。(ここでは$MT_DIR/plugins/MyPlugin01/config.yaml)
id: MyPlugin01 name: Sample plugin registration version: 1.0 description: Sample plugin registration author_name: Plugin author author_link: http://www.example.com/about/ doc_link: http://www.example.com/docs/
ほとんどの行が、ルールのようなものですから、前述のプラグイン開発の手順に従い保存してください。
次に、新しくオブジェクトを作成した際に、指定する値について解説します。
- id(必須)
- 固有のIDを定義します。
- name(必須)
- プラグインの名前を定義します。
- version(必須)
- プラグインのバージョンを定義します。
- description
- プラグインの概要を記述します。このプラグインがどんな機能を提供するかを、簡単に解説します。
- author_name、author_link
- プラグインの作者の名前や作者のホームページへのリンクを定義します。プラグインを解説するページがある場合、 author_link の代わりに plugin_link を定義してもかまいません。
- doc_link
- プラグインのマニュアル、リリースノート等のドキュメントへのリンクを定義します。プラグインを利用する上で重要なものなので、 必ず設定するようにしましょう 。
Movable Type は、Ver.3系からVer.4系へのアップグレード時にプラグイン開発方法が大きく変更になりました。その中で、いくつか特徴的な例を挙げます。
- レジストリによるプラグイン拡張
- レジストリという仕組みを導入する事で、プラグインでレジストリを編集し機能を拡張できるようになりました。
- MTコンポーネントによるオブジェクトの拡張と作成
- MTコンポーネントを拡張する事で、既存オブジェクトの拡張と、新規オブジェクトの作成ができるようになりました。
- MTコンポーネントによる管理画面の拡張
- MTコンポーネントを拡張する事で管理画面を拡張し、オブジェクトの作成、修正、削除が出来る画面等を追加、拡張する事ができるようになりました。
- config.yamlによるプラグインの設定
- 従来のxxx.plでのプラグインの設定も可能ですが、あたらしくconfig.yamlでの設定も可能になりました。
- xxx.plで可能だったperl関数を直接書き込むといったテクニックはconfig.yamlでも利用可能です。しかし、エラーになった場合にどの部分でエラーが発生しているかが解りにくいためお勧めしません。
tags: function: HelloWorld: sub { return "Hello, world!" }
- 今後プラグインの作成例にはconfig.yamlを利用します。
最後に、プラグインを開発する上でのベストプラクティスともいえるノウハウを紹介します。
- プラグインの名前の先頭に MT を付けるとタグの呼び出しに"<$MTMTfoobar$>"と"MT"が重なるため避けましょう。
- マニュアルやリリースノートへのリンクを必ず用意しましょう。
- プラグインに独自の設定をおこなう場合は、プラグインの設定画面を用意しましょう。
- 直接データベースにアクセスすることは避け、Movable TypeのAPIを利用しましょう。
- プラグインはコンパクトに開発しましょう。これは、使用するメモリーの量をおさえ、パフォーマンスを高めるためです。
- Movable Typeは、多くのPerlのバージョンの環境で動作するように考慮されています。たとえば、 use base を使わないように、利用するPerlのバージョンを限定しないように開発しましょう。
- 多くのユーザーの方がダイナミックパブリッシングを利用しています。テンプレートタグやテキストフィルター、グローバル・モディファイアのプラグインを開発する際は、ダイナミックパブリッシングをサポートするようにしましょう。
- プラグイン開発のためのファーストステップ
- レジストリ、YAMLについて
- 環境変数について
- プラグインのローカライゼーションについて
- テストドリブンでのプラグインの開発について
- グローバル・モディファイアプラグインの開発について
- ファンクションタグ プラグインの開発について
- ブロックタグ プラグインの開発について
- コンディショナルタグ プラグインの開発について
- プラグインのデバッグ
- プラグインの設定方法
- コールバックとフックポイント
- スケジュールタスクの開発
- MTオブジェクトの利用方法
- 独自オブジェクトの作成
- 新規アプリケーションの作成
- Transformerプラグインの開発
- 管理画面のメニュー修正
- リストアクションの追加
- 動作モードの追加とモーダルウィンドウの表示
- 外部Web APIとの連携
- 権限とロール