アルファサード株式会社 代表取締役 野田 純生のブログ


PHPerのための Movable Type 講座(その8)


公開日 : 2014-04-18 19:19:17


ようやくプラグインまで来ましたよ。今回はダイナミックパブリッシング対応プラグインの作成について紹介します。

すでにご紹介した通り、MTのダイナミックパブリッシングのうち、テンプレートエンジンは Smartyを継承したクラスになっています。よって、テンプレート・タグを拡張するプラグインは Smartyのプラグインのお作法に従って書くことになっています。

しかしながら、MTのダイナミックパブリッシングのプラグインはテンプレート・タグの拡張だけではありません。

ダイナミックパブリッシング初期化時に実行される init.foo.php

MTのダイナミックパブリッシングプラグインは、mt/plugins/PluginName/php/ 以下に置きます。 init.foo.phpは、ダイナミックパブリッシングの初期化時に require(include)されるファイルです。init.ではじまり、.phpで終るファイル名であれば、名前は何でも構いません。

$MT_DIR/
|__ plugins/
   |__ MyPlugin/
      |__ php/
         |_init.foo.php

通常、MyPluginディレクトリ直下に、config.yamlや、lib/以下にPerlモジュールを配置しますが、ダイナミックパブリッシング専用であれば、それらも不要です。

init.foo.phpでは様々なことができます。例えばこのシリーズの最初の回で紹介した「生」PHPでの処理も、プラグインとして設置したinit.foo.phpの中に記述すれば、ダイナミックパブリッシングの処理(ファイルが存在しない時(DynamicMTMLではファイルが存在する時も)、mtview.phpに処理が渡され、その後require(include)される)の初期化時に処理が通ります。

一般的に、ここで行われる処理については、MultiBlogプラグインが参考になるでしょう。

$MT_DIR/
|__ plugins/
   |__ MyPlugin/
      |__ multiblog.pl
      |__ lib/
      |__ tmpl/
      |__ php/
         |_init.MultiBlog.php

init.MultiBlog.phpで行われている処理は、主にMTのPHPのコアのテンプレートタグ(MTEntriesなど)をマルチブログ対応のタグにオーバーライドする処理です。タグのオーバーライドは、 $ctx->add_tag、$ctx->add_container_tag など、MTViewerクラスのメソッドを使います。このあたりは、「その5」を参考にしてください。

カスタムアーカイブタイプの動的登録

他に行われることとして、カスタムアーカイブの登録、独自カスタムフィールドの登録などが挙げられます。独自アーカイブタイプの登録方法については、以下のプラグインが参考なるでしょう。

このプラグインは、年度別アーカイブをダイナミックパブリッシング対応にするものです。但し、注意点として、カスタムアーカイブをダイナミックパブリッシング対応にするためには、Perlプラグインを合わせて作成する必要があります。

上記のプラグインは、Hirotaka Ogawaさんが作成されたPerl(スタティックパブリッシング用)の年度別アーカイブを、ダイナミックパブリッシングに対応させる用途で作成したものです。Movable Typeでは、再構築処理(Perl-静的側)によって、mt_fileinfoテーブルにレコードが生成されます。ダイナミックパブリッシングでは、この mt_fileinfo レコードをみて、テンプレートのコンテキストを組み立てるようになっていますので、カスタムアーカイブを作成するためには、Perl側のコードも書かなければならないことに注意する必要があります。

カスタムフィールドの動的登録

これも、初期化時に実行される init.foo.php に記述されるのが一般的です。数値型カスタムフィールドを登録する以下のプラグインが参考になると思います。

init.NumericFields.php

<?php
    global $customfield_types;
    $customfield_types[ 'ninteger' ] = array(
        'field_html' => array (
            'default' => 'customfield_html_text',
            'author'  => 'customfield_html_text',
        ),
        'column_def' => 'vinteger_idx',
    );
    $customfield_types[ 'nfloat' ] = array(
        'field_html' => array (
            'default' => 'customfield_html_text',
            'author'  => 'customfield_html_text',
        ),
        'column_def' => 'vfloat_idx',
    );
?>

このコードですが、ダイナミックパブリッシングにおいては殆どの場合これで十分なのですが、この記事で紹介した、BaseObject::install_meta を行っておく必要があります。この処理を忘れると、MTEntriesでのカスタムフィールドでのフィルタリングができなくなりますので注意が必要です。

カスタムフィールドの初期化時の処理については、 addons/Commercial.pack/php/init.CustomFields.php がそのまま参考になるでしょう。

そして、カスタムアーカイブと同じく、PHPコードを用意しただけでは、管理画面にフィールドが現れませんから、Perl側のコードも書いてやる必要があります。そのあたりがMTのプラグイン開発で面倒なところではあるのですが、管理側は常にPerlで拡張する必要があります。

その他、init.foo.php の活用方法

init.foo.phpは、要するに初期化時に実行されるPHPプログラムですから、この一連のシリーズ? の読者の方なら他の利用方法も浮かんでいることだと思います。「生」PHPもよいですが、ドキュメントルートにPHPプログラムを置かずに拡張できるわけですから、メンテナンスやセキュリティ、分業時の役割分担的に、この仕組みを使わない手はありません。

ざっと思い浮かぶ利用方法をまとめます。

  • 独自カスタムアーカイブの登録(初期化)
  • 独自カスタムフィールドの登録(初期化)
  • テンプレートタグの登録(オーバーライド)
  • DynamicMTML的な処理の追加

テンプレート・タグプラグインまで行きたかったのですが、相応のボリュームになってしまったので、次回以降に続きます。



このブログを書いている人
野田純生の写真
野田 純生 (のだ すみお)

大阪府出身。ウェブアクセシビリティエバンジェリスト。 アルファサード株式会社の創業者であり、現役のプログラマ。経営理念は「テクノロジーによって顧客とパートナーに寄り添い、ウェブを良くする」。 プロフィール詳細へ