第1回】プラグイン開発のためのファーストステップ
このページは既にhttps://github.com/movabletype/Documentation/wiki/Japanese-plugin-dev-1-1に移行されています。
はじめに
シックス・アパートの上野初仁(はつひと)です。
今回は、プラグイン開発のファーストステップとして、プラグインの開発の全体像を紹介します。
プラグインの種類について
プラグインは、特定の機能や限定された機能をMovable Typeに追加する小さなソフトウェアです。Movable Typeのプラグインには、主に次の種類があります。
- ファンクションタグ プラグイン
標準で提供されているテンプレートタグを拡張したり、他システムからのデータを取得するテンプレートタグを追加できます。たとえば、GoogleやYahoo!が提供するAPIを利用し、該当のエントリーに関連する検索結果をエントリーに埋め込むことができます。
- ブロックタグ プラグイン
Movable Typeには複数回にわたって動作するブロックタグがあります。MT::Entryなどを複数取得しそこから特定の値だけを抽出して出力するなどの機能を追加できます。
- コンディショナルタグ プラグイン
Movable Typeには、MTブロックタグに条件分岐機能を追加するコンディショナルタグがあります。これらのコンディショナルタグを追加、拡張する事でブログ記事などを出力する際に、出力に条件分岐の機能を追加できます。
- グローバルモディファイア プラグイン
Movable Typeには、dirifyやpadのように様々なグローバルモディファイアが用意されています。これらのグローバルモディファイアを追加、拡張する事でテンプレートタグにフィルタリングなどの機能を追加できます。
- Transformer プラグイン
たとえば、CsutomFieldsプラグインのように、管理画面をカスタマイズし、独自の機能を追加できます。
- スパム フィルター プラグイン
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/plugin/(プラグイン名)/config.yaml という形でファイルを作成します。
(ここでは$MT_DIR/plugin/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
プラグインのマニュアル、リリースノート等のドキュメントへのリンクを定義します。プラグインを利用する上で重要なものなので、必ず設定するようにしましょう。
MT3.3とのプラグイン作成の差異
Movable Type は、Ver.3系からVer.4系へのアップグレード時にプラグイン開発方法が大きく変更になりました。その中で、いくつか特徴的な例を挙げます。
- レジストリによるプラグイン拡張
レジストリという仕組みを導入する事で、プラグインでレジストリを編集し機能を拡張できるようになりました。
- MTコンポーネントによるオブジェクトの拡張と作成
MTコンポーネントを拡張する事で、既存オブジェクトの拡張と、新規オブジェクトの作成ができるようになりました。
- MTコンポーネントによる管理画面の拡張
MTコンポーネントを拡張する事で管理画面を拡張し、オブジェクトの作成、修正、削除が出来る画面等を追加、拡張する事ができるようになりました。
- config.yamlによるプラグインの設定
従来のxxx.plでのプラグインの設定も可能ですが、あたらしくonfig.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について」という題で、プラグイン開発には欠かせないレジストリの概念について説明させていただきます。