2011年01月26日
New DynamicMTML(PHPによるMovable Typeの拡張)-4
引き続き新しいDynamicMTMLに関する開発者向けの情報をご紹介します。
- New DynamicMTML(PHPによるMovable Typeの拡張)-1
- New DynamicMTML(PHPによるMovable Typeの拡張)-2
- New DynamicMTML(PHPによるMovable Typeの拡張)-3
MTPluginクラス
Movable TypeのPHPプラグイン作成についてはドキュメントが少ないこと、Perlとお作法が違うこと(ファンクションタグの例)から作成している人はPerlと比較して少ないようです。DynamicMTMLのPerl互換ライブラリによってコードは比較的近い形で書けますが、プラグインの構造やお作法については何となく馴染めない(例:タグの数だけファイルが必要)、という方も多いのではないでしょうか。
新しいPower CMS for MT(DynamicMTML)では、PHPのプラグインのベースとなるMTObjectクラスが追加されました。これを利用することで、プラグインの利用、設定へのアクセス、タグの追加などをひとつのconfig.phpの中に記述できるようになり、メンテナンス性が大きく向上するとともに、PHPの(忌まわしい!)関数名の重複などを気にする必要がなくなります。
config.phpの記述ルール
プラグインがMyPluginの場合、mt/plugins/MyPlugin/php/config.phpに設置したものがプラグインとして認識されます。プラグインはクラスMTPluginを継承する形で記述します。以下に例をあげます。
<?php
class MyFirstPlugin extends MTPlugin {
// var $registryに設定やタグ、コールバック等をまとめて記述します。
var $registry = array(
'name' => 'MyFirstPlugin',
'key' => 'myfirstplugin',
'config_settings' => array(
'PluginConfigSetting' => array( 'default' => 0 ),
),
'settings' => array(
'example_setting' => array( 'default' => 1 ),
),
'tags' => array(
'block' => array( 'example_block' => 'hdlr_block' ), // ,...
'function' => array( 'example_function1' => 'hdlr_function' ), // ,...
'modifier' => array( 'example_modifier1' => 'filter_modifier' ), // ,...
),
'callbacks' => array(
'build_page' => 'filter_build_page',
'post_init' => 'post_init_routine',
),
);
// 以下、タグやコールバックに対応するメソッド
}
?>
テンプレートタグの場合、ハッシュのキーがタグ名、値がメソッド名です。上記の例の場合、クラスメソッドhdlr_functionを指定することでファンクションタグ<mt:example_function1>が動的にロードされ利用できるようになります。
このプラグインをconfig.php形式にすると以下のようになります。タグが一つの場合はconfig.phpにするメリットはあまりありませんが、複数のタグを管理したり共通のメソッドを記述することで開発規模が大きくなってきた際にその効果を実感できるのではないかと思います。
<?php
class HelloWorld extends MTPlugin {
var $registry = array(
'name' => 'MyFirstPlugin',
'tags' => array(
'function' => array( 'helloworld' => 'hdlr_helloworld' )
),
);
function hdlr_helloworld( $args, &$ctx ) {
return 'Hello, world!';
}
}
?>
config.yamlでの定義
DynamicMTMLはプラグインの初期化の際にプラグイン直下にconfig.yamlがあればそのファイルをロードしてタグやコールバックを登録します。よって、config.phpに記述するかわりにconfig.yamlに記述しても同じように動作します(この時config.phpに設定が存在すればそちらが優先されます。そして、この時ハッシュの値に指定するメソッドはconfig.php内に記述します)。
MTで開発をしている人ならおわかりいただけるかと思いますが、PerlとPHPの両方に対応させる時に、構造や設定をconfig.yamlに、Perlのコードはlib/Tags.pmに、PHPのコードはphp/config.phpに記述するといった管理ができます(もちろんconfig.phpからphp/Tags.phpをincludeするようにするなどのやり方もできるでしょう)。
config.yamlとプラグインのローカライゼーション
MTは(2月から!!)国産CMSとなるわけですが開発のベースは英語で作られており、各国語にローカライズされています。
DynamicMTMLはローカライズについてもPerlときわめて近い方法で行うことが可能です。config.yamlを起点としたHelloWorldプラグインのファイル構成を以下に示します。
MT_DIR/
|_ plugins/
|_ HelloWorld/
|_ config.yaml
|_ lib/
| |_ HelloWorld/
| |_ Tags.pm
| |_ L10N.pm
| |_ L10N/
| |_ ja.pm
|_ php/
|_ config.php
|_ l10n/
|_ l10n_ja.php
PHPの言語ファイルはpluginディレクトリのphp/l10n/以下にl10n_ja.phpのような名前で設置します。
<?php
$Lexicon = array(
'Hello, world!' => 'こんにちは、世界!',
);
?>
テンプレートタグで各言語に翻訳するにはmt:setvarとmt:transタグを使います。この時、翻訳される言語は、1.ユーザーがログインしていてユーザーのコンテキストがセットされているブロックでは現在のユーザーの言語、2.それ以外ではDefaultLanguageで設定されている言語になります。
<$mt:HelloWorld setvar="hello"$>
<$mt:trans phrase="$hello"$>
プラグイン内での翻訳は以下のようになります。
<?php
class HelloWorld extends MTPlugin {
function hdlr_helloworld( $args, &$ctx ) {
return $this->translate( 'Hello, world!' );
}
}
?>
サンプルプラグイン
MT::Plugin(MT::PluginData)互換のメソッド
- $app->component($plugin_name)
config.yamlまたはconfig.phpで定義したクラスを取得します。config.yamlのみでconfig.phpが存在しない場合はMTPluginクラス、config.phpが存在する場合はconfig.phpで定義したクラスを取得します。
- $plugin->get_config_obj($scope)
該当のプラグインのMT::PluginDataオブジェクトを取得します。MT::PluginDataが存在しない場合はプラグインの初期設定値をセットしたオブジェクトを生成して返します。$scopeは"blog:1"のようにブログIDを含む文字列を渡します。書略した場合はシステムスコープのプラグイン設定を返します。
- $plugin->get_config_hash($scope)
MT::PluginDataオブジェクトから設定値のみをキーと値の配列で返します。MT::PluginDataが存在しない場合はプラグインの初期設定値をセットした値を返します。
- $plugin->reset_config($scope)
MT::PluginDataに保存された値をクリアして設定を初期値にリセットします。
- $plugin->config_vars()
プラグイン設定のキーの配列を返します。
- $plugin->get_config_value($key,$scope)
キーとスコープを指定してプラグイン設定を取得します。MT::PluginDataが存在しない場合は初期値を返します。
- $plugin->set_config_value($key[,$value,$scope])
キーと値、スコープを指定してプラグイン設定を更新します。$keyにキーと値の配列を渡した場合、第二引数$valueがスコープとなります。
コメントを投稿する