MovableTypeのプラグイン開発

  • 投稿日:
  • by
  • カテゴリ:

Windows Live Writerからの投稿と Smart Blogとの組み合わせが悪いとわかったときに、乱暴なワタシは、すぐに、Movable Type本体に手を入れてしまおうと思ったのですが、そんなことをしたら、アップデートもままならないし、全く推奨できない方法であることはあからさますぎるくらいに明らかなので、別の方法を模索することにしました。

いうまでもないのですが、Movable Typeには、機能を拡張するための plugin という枠組みがあります。まっとうな人間はこの機能を、この種の目的に使うのであることは、これまた明らかなのです。

そんなわけで、やったこともない、プラグインの開発などに手を出してみることにしたのです。

プラグインの開発については、オンラインのドキュメントがありますので、これを参考にすれば、PerlやらPHPがある程度わかっていればそれほどたいした手間をかけずに出来るようになります。

今回の目的は、Movable Typeに記事が投稿されるタイミングを見計らって、記事をスキャンして、もし、画像ファイルが Asset にあれば、これを投稿しようとしているエントリに関連づける、ということなので、Movable Typeの何らかのイベントにフックするのが妥当です。

と、いうことで、

あたりを参考に作業を進めました。

プラグインの動作は、config.yamlがかなり大きな部分を担っています。プラグインが何をするものなのかなどの説明の他に、今回のコールバックのようなものの場合は、どのフックポイントからのコールバックをどのクラスのどの関数に処理させるのかなども記述します。

ここに、コールバックが設定されるだけで、すぐに、プラグインは動作を開始します。後は、コールバック関数で、やらせたい処理を実装するだけなのです。

従って,このファイルがおかしなコトになっていると、Movable Typeの管理画面から、「プラグイン」を開こうとしても、開けなくなってしまいます。恐ろしや。プラグインの一覧が開かなくなったら、config.yamlの内容が不適切である場合がほとんどだと思われます。要確認。

ローカライゼーションは、する必要があるかどうかは微妙ですが、まあ、説明など、英語と日本語くらいは場合分けして用意しておいたらいいでしょう。もちろん、言うまでもないことですが、L10N.pmや、en_us.pm, ja.pmなんかに問題があると、config.yamlそのものに問題があるのと同様に、プラグインの一覧が開かなくなりますから、注意が必要です。実際、このプラグインの開発に要した時間の半分は、ここの問題でした(笑)

フックするポイントは重要です。エントリが保存されるタイミングで引っかけられるフックポイントは次の四つがあります。

  • MT::App::CMS::cms_pre_save.entry
  • MT::App::CMS::cms_post_save.entry
  • api_pre_save.entry
  • api_post_sav.entry

それぞれ、管理画面からの保存とXMLRPCによる保存、それと、処理の前後になります。それで計四つ。Windows Live Writer からのポストだけに対応するのであれば api_の方だけひっかければいいのですが、テストの簡便性やらもあって、MT::App:CMS::cms_ の方も引っかけます。

問題は、前にするのか後にするのかなのですが、結論から言うと「後」の方を引っかけないとダメでした。と、いうのも、保存処理の中で、関連づけられた Assetのリストをチェックして、不要なものは関連を破棄する処理が入っているのです。

これをやられてしまうと、折角、プラグインでおこなった関連づけが消されてしまうので、何にもならないのです。実際、最初はセーブ前の方をフックしてやっていたのですが、いくら関連づけをおこなっても、全く実際には反映されないで、ただ、関連づけをおこなう MT::ObjectAsset->idだけがどんどん大きくなるばかりという素敵な実装になってしまったのです。この問題の原因が「前」だからだということに気づくのに、開発時間のおおよそ半分を費やしました。

ええ、半分は「前だから」で、残り半分が「ローカライゼーション」ですから、プラグイン本体ってば、実に単純明快、開発時間ほぼゼロ、というか、ソースをタイプしていた時間だけというシンプルさなのです。アホです。まあ、プログラミングなんてそんなものです。

そんなわけで、BindImageAsset プラグインは完成したのでした。なお、既に投稿されているエントリには全く作用しないし、FTPでアップロードされて Asset の管理外になっている画像についても、作用することはないので、このあたりもどうにか出来るようなことをちょっと考えています。