ダイナミック・パブリッシング対応 indexcontext プラグイン

すっかりおなじみになった「MTプラグイン PHPizeプロジェクト」第6弾!

今回勝手にPHP対応化させていただいたのは、idxctxプラグイン
またまた小粋空間さんで紹介されていて初めて知ったのですが、これは便利だ、しかしダイナミック・パブリッシング未対応! ということで早速私の手で! ということなのです。

2007/05/29 ライセンスについて追記あり】

ダウンロード

(どちらかを選択してください。内容は同じです。)

インストール

  1. ダウンロードしたファイルを解凍してください。
    ただ一つのPHPファイル block.MTIndexContext.php が生成されます。
  2. 解凍して得られたファイルを、[MT]/php/plugins/ フォルダ内にコピー(アップロード)してください。

使い方

オリジナルのサイト、もしくは小粋空間さんによる紹介ページを参照してください。

ここでは簡単に、オリジナルサイトの紹介文を引用しておきたいと思います。

例えばエントリーアーカイブで、ブログ全体の最新コメントをサイドバーに表示させたい場合。
MTの仕様では難しい(出来ない?)んですよね。
該当のエントリーのコメントだけがMTCommentsの対象になるので。

例えば月別アーカイブで、ブログ全体の最新エントリーをサイドバーに表示させたい場合。
出来ないんですよね。該当の月のエントリーだけがMTEntriesの対象になるので。

そこで、MTIndexContext というコンテナ・タグを追加するプラグインを作りました。

《中略》

このコンテナ・タグで囲んだ箇所は、一時的にインデックステンプレートと同じ振る舞いになります。

技術情報

ここでは、Movable Type(以下、MT)において、「コンテキスト(テンプレート・コンテキスト)」という概念がどういうものか、ということが大体分かっている方を対象に解説します。
「何それ?」「よく分かんない~」という方は、私の説明記事を参照していただければ幸いです(→「テンプレート・コンテキスト」とは)。
もちろん、難しい話になりますので、興味のない方は読み飛ばしてくださってもいっこうに構いません。

このプラグイン、Perl版のソースは非常に「コロンブスの卵」的にシンプルになっています。
今がどんなコンテキストの状態かにかかわらず、無理矢理新しいまっさらなコンテキストを与えて、そいつに全てを処理させる、という方式を採っているのです。
結果として、インデックス・テンプレートの(一番外側の)コンテキストに沿ってテンプレート(コンテンツ)が処理されるのと同じ結果が得られる、というわけです。

PHP版(ダイナミック・パブリッシング)では、この方法をストレートに使うことはできません。
これは簡単に言うと、スタティックページを再構築するときとダイナミック・パブリッシングでページを動的生成するときとで、コンテナタグの振る舞いに以下のような違いがあるからです:

スタティックの場合
  • 内容(コンテンツ)は、コンテナタグの処理の中で解析・処理される。
  • コンテナタグの処理ルーチンは、一度だけ呼ばれ、内部自己完結する。
ダイナミックの場合
  • 内容(コンテンツ)は、あらかじめ解析・処理されたものがコンテナタグの処理へと引き渡される。
    (ただし最初に処理が始まる前に「初期処理」を施すことは可能)
  • コンテナタグの処理ルーチンは、初期処理で一度、本処理でループの回数分だけ呼ばれる。処理のコントロールは「コンテキスト」そのものが握っている。

つまり、処理方法をコンテナタグ自身が決められる自由度が、ダイナミックの方はスタティックより低いのです。しかもテンプレートのすべての処理を、その実権は「コンテキスト」に握られてしまっているのです。
唯一、「初期処理」でうまく調整してやるしか方法はないのです。

そこで、今回のPHP化でも、「初期処理」でなんとかする方法を採っています。

ただ、やっていることは非常に単純です。
インデックス・テンプレートにはなくて、アーカイブ・テンプレートには存在する可能性のある「内部状態」を、初期処理ですべてバックアップした後初期化してしまっています。
そしてコンテンツの処理が終わった後に、それらをリストアしている、というわけです。

興味のある方は、PHPファイル block.MTIndexContext.php の中身を覗いてみてください。
PHP版(ダイナミック・パブリッシング対応)コンテナタグの、ごくごく基本的なソースになっています。

互換性について

現在公開されているidxctxプラグインと互換性があります。
代表的な事例(エントリーアーカイブでブログ全体の最新コメントを表示、月別アーカイブでブログ全体の最新エントリーを表示、等)で、現行のPerl版 idxctxプラグイン と同じ挙動になることを確認しております。

著作権・ライセンスについて

ただいま調査中です。
ソースそのものは、オリジナルの動作を完全にシミュレートする形で一から書き起こしていますので、著作権の侵害には当たらないと思われますが、ライセンスに関しては詳細が判明次第、ここに追記いたします。

追記:2007/05/29】
PHP版indexcontextプラグインの著作権は、原作者であるsawada氏、およびPHP版制作者である あんちもん2 が主張させていただきます。
(block.MTIndexContext.php: Copyright (c) 2007 sawada, Antimon2)
なお、オリジナルのPerl版indexcontextプラグインについては、原作者のsawada氏に著作権があります。

またこのプラグインは、MITライセンス日本語参考訳)に順ずるものとします。
簡単に言えば、『使用制限なし、再配布や改造など問題なし、ただし無保証』ということです。

なお、こちらで公開しているPHPソースおよびそれを使用したことによる問題点や気づいた点に関して、原作者に直接問い合わせをしないでください。
この記事へのコメント、もしくはトラックバック等でお願いいたします。

トラックバックURL

このエントリーのトラックバックURL:
http://www.antimon2.atnifty.com/mt/mt-tb.cgi/67

トラックバック

» 月別アーカイブにも月別アーカイブ一覧を表示(ややこしい):indexcontext.pl from metabolism
 今日はMTづいてますw  久し振りに小粋空間さんを彷徨ってたら、ずっと欲しかっ... 続きを読む

コメントする