MTプラグインのMovable Type 5.0対応とか

粛々と対応していたMovable Typeプラグインの5.0対応したのを更新してみた。

Movable Type 5.0は現時点ではBetaリリースなんですが、開発者向けの資料がみつからず内部的に何がかわったかよくわからず試してみてダメだったところを直すという感じで対応。

結論から言うと対応を要した5.0での変更点は

  • (perl)のデフォルト文字コードがutf-8になった(らしい)
  • MT.phpのメンバがpublicからprotectedに変更された

というところ、

前者の場合、utf8な外部からデータを取ってきて出力するようなプラグインはそのまま出力できるようになった。でも過去互換もとらないといけないのでとりあえず、

use utf8;
...
sub fn() {
...
utf8::encode($contents) if MT->version_number < 5;
$contents
}
1;

な感じで、プラグイン内ではutf8で処理して(use utf8;)、出力する際にMT5未満ならフラグを落として返してあげる、5以上ならそのまま出力。本当はMTのバージョンではなくそのPerlの内部コードやらで判定してやりたかったのだけどPerlの文字コード周りがよくわからないので妥協。

後者の場合、phpダイナミックパブリッシングを処理するプラグインにおいて、dbをみる場合に

$config = $ctx->mt->db->fetch_plugin_config('SyntaxHighlighter', "blog:$blog_id");

などをしていたらMT5ではMT.phpのメンバ変数が全部protectedに変わっているのでアクセスできなくなった。$dbに関してはdb()というpublicなgetterが用意されているのでこれを使うようにした。

$config = $ctx->mt->db()->fetch_plugin_config('SyntaxHighlighter', "blog:$blog_id");

それ以外の変数を使ってないので大丈夫かよくわからない。

設計面でみるとMovable Typeはかなりobjectiveにつくられておりこのあたりのアクセス件は厳密にするのが設計ポリシーなのだろうと予測。WordPressなんかは逆にphpの何でもできるところをそのまま継承して多くの機能がglobalにアクセスできる用にしている気がする。

どちらが良いというわけじゃなくいろんな文化があることが良いと思う。

ただ、いい加減Movable TypeのダイナミックパブリッシングはPerlにして欲しい。ポリシー以前に言語を二つ使うのはプラグイン開発者としてはしんどい。