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


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


公開日 : 2014-04-20 16:33:20


PHPerのためのMovable Type

DynamicMTML編。

DynamicMTMLは、Movable Typeのaddonで、PHPによるダイナミックパブリッシングを拡張するフレームワークです。

ドキュメントはかなり詳しく書いたつもりなので詳細はそちらを見ていただくとして、簡単に言うと、以下のようなことが実現できます。

  • スタティックなHTMLファイルの中のMTML(MTタグ)をダイナミックに処理できる
  • ダイナミック処理を前提とした様々なMTタグ(ログイン判別、UA判別)
  • コールバックプラグインを作成することができる(処理の割り込み、カスタマイズ)
  • MT::Object ライクなORマッパ
  • class MTPluginによる、プラグイン作成支援
  • PHPによるタスク、キューの実行

等々。DynamicMTMLは単なるスタティックなHTMLファイルの中のMTML実行エンジンではありません。

ブログをまたがったカテゴリ串刺しアーカイブをよりスマートに実現する

前々回紹介した「ブログをまたがったカテゴリ串刺しアーカイブ」ですが、DynamicMTMLを使うことで、よりスマートに実装できるようになります。

  • 前回は、/category.php/movabletype/ のようなURLでしたが、素直に /movabletype/ 等のパスで動作させられるようになります。
  • /movabletype/template/ などのようにサブカテゴリにも対応します。
  • 最上位のブログ(ウェブサイト)にカテゴリが存在する必要があります。
  • プラグインファイル一つに様々な処理を集約できます(複数のテンプレートタグも、コールバックプラグインもひとまとめにできます)
  • テンプレートをヒアドキュメントに書くのではなく、MTのテンプレートとして管理できるようになります。テンプレートとして管理し、パブリッシュしたファイルを出力テンプレートにする、ということです。

プラグインの作成

実は、ここでやろうしていることを少し前にPowerCMSのブログに書きました。以下の記事です。

また、DynamicMTMLの config.php 形式でのプラグイン作成方法は下記の記事で紹介しています。

今回、コードは以下にUPしました。

構造とポイントのみ下記に書きます。

$MT_DIR/
|__ plugins/
   |__ EntriesFromRSS/
      |__ php/
         |_config.php

$registryプロパティに配列でコールバックやタグを登録します。複数のタグや処理も一つのファイルの中にスッキリと書くことができます。

<?php
require_once( 'MTUtil.php' );
class EntriesFromRSS extends MTPlugin {
    var $registry = array(
        'config_settings' => array(
            'RewriteArchiverRewriteTo' => array( 'default' => '/archiver.html' ),
        ),
        'callbacks' => array(
            'post_init' => 'rewrite_archiver',
        ),
        'tags' => array(
            'block' => array(
                'entriesfromrss' => '_hdlr_entriesfromrss',
            ),
        ),
    );
    function rewrite_archiver ( $mt, &$ctx, &$args ) {
        // 初期化後に割り込み処理を入れる
        // URLを見て、カテゴリベースネームに合致したら$ctxをセットし、
        // URLを騙して(/archiver.html)に騙して処理する
    }
    function _hdlr_entriesfromrss  ( $args, $content, &$ctx, &$repeat ) {
        // ブロックタグの処理を書く
    }
}
?>

テンプレートの準備

前々回と同じく、atom.xmlのテンプレートをべースにします。前々回と同じように、カテゴリ名でも良いのですが、今回はカテゴリのベースネームを使うことにします。

atom.xmlテンプレートの変更箇所は以下の箇所です。

<MTIgnore>記事数の変更と、対象ブログの変更</MTIgnore>
<mt:Entries blog_ids="all" lastn="1000">

<MTIgnore>カテゴリ名→カテゴリベースネームに変更</MTIgnore>
<mt:EntryCategories>
    <category term="<$mt:CategoryBasename encode_xml="1"$>" scheme="http://www.sixapart.com/ns/types#category" />
</mt:EntryCategories>

表示テンプレート(インデックステンプレート)を作る

出力先 archiver.html のインデックスアーカイブを作ります(スタティック)。ポイントはMTDynamicMTMLタグです。このタグで囲まれた部分は、再構築時に処理されず、MTタグがそのまま静的ファイルの中に書き出され、DynamicMTMLによって動的に処理されます。

<MTDynamicMTML>
<h1><MTCategoryLabel escape="html"></h1>

<mt:EntriesFromRSS xml="atom.xml" category="$category" limit="$limit" offset="$offset">
<mt:if name="__first__"><ul></mt:if>
<li><a href="<mt:var name="permalink">"><mt:var name="title"></a></li>
<mt:if name="__last__"></ul></mt:if>
</mt:EntriesFromRSS>
</MTDynamicMTML>


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

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