●ダイナミック・パブリッシング対応 MTTagInvoke プラグイン
私自身は、このブログではダイナミック・パブリッシングを導入していません。
ただそのニーズはあると思ったので、MTのオリジナル・プラグインを公開するときはできる限りダイナミック・パブリッシング対応になるようにしています。
先日の「SbCodeプラグイン」もそうですし、以前に公開した「AutoIncrementalVarプラグイン」も、実際にダイナミック・パブリッシング環境で使っていただけているようで、作者としてはうれしい限りです(^-^)
そこで、個人的に新しいプロジェクトを発足!
既存のプラグインを勝手にPHP対応にする、その名も「MTプラグイン PHPizeプロジェクト」!
実は過去に、CompareプラグインをPHP化しているので、今回は第2弾! ということになります。
今回提供するのは、「MTTagInvokeプラグイン」!
動作環境
Movable Type(以下、MTと略記)ver.3.x、ver.4 以降。
(MT4用、MT3用を別アーカイブで用意しています。)
【※2007/08/19 MT4に正式対応】
ダウンロード
(どちらかを選択してください。内容は同じです。)
MT4用
- MTTagInvoke_php.zip[3,540 Bytes]
- MTTagInvoke_php.tar.gz[1,129 Bytes]
MT3用
- MTTagInvoke_php_MT3.zip[3,507 Bytes]
- MTTagInvoke_php_MT3.tar.gz[1,139 Bytes]
インストール
MT4の場合
- ダウンロードしたファイルを解凍してください。
解凍ソフトに「ディレクトリ構造を**」というオプションがある場合は、「ディレクトリ構造を有効(再現、等)」にして解凍すると、以下のようなディレクトリ構造が生成されます:
[MTTagInvoke_php] ┗[php] ┗(5個のPHPファイル)
- 解凍して得られた MTTagInvoke_php フォルダをまるごと、[MT]/plugins/ フォルダ内にコピー(アップロード)してください。
MT3の場合
- ダウンロードしたファイルを解凍してください。
解凍ソフトに「ディレクトリ構造を**」というオプションがある場合は、「ディレクトリ構造を有効(再現、等)」にして解凍すると、以下のようなディレクトリ構造が生成されます:
[php] ┗[plugins] ┗(5個のPHPファイル)
- 解凍して得られた(php/plugins/ 以下の)5個のPHPファイルを全て、[MT]/php/plugins/ フォルダ内にコピー(アップロード)してください。
使い方
小粋空間さんが「個別エントリーアーカイブに同一カテゴリーのエントリーを表示」という記事で、MTTagInvokeの具体例を示してくださっています。
ぜひ参考にしてみてください。
またもちろん、オリジナルのサイト(英語)も参照してください。
互換性について
一般的な使い方をする分には、通常のMTTagInvoke(v1.0)の使い方で問題はありません。
ただ1点、もとい2点、注意点があります。
- コンテナタグを処理しようとする場合、<MTTagInvokeContent>~</MTTagInvokeContent>ブロックを省略しないでください。
- コンテナタグを処理しようとする場合、<MTTagInvokeContent>~</MTTagInvokeContent>は最後に記述してください。
コンテナタグというのは、<MTEntries> とか <MTSetVarBlock> のように、開始タグと終了タグがありその間の記述(コンテンツ)を処理するテンプレートタグのことです。
なので普通は<MTTagInvokeContent>~</MTTagInvokeContent>ブロックを省略することなんてないと思いますが、オリジナルの(Perl版の)MTTagInvokeでは、MTTagInvokeContentブロックを省略しても正常に動作します。(コンテンツが空っぽという前提で処理されます。)しかし拙作のPHP版では、MTTagInvokeContentブロックが省略された場合はそのコンテナタグは処理されません。
例えば、以下のような記述を考えます。
<$MTSetVar name="a" value="これが表示されたらNG!"$> <MTTagInvoke> <MTTagInvokeName>MTSetVarBlock</MTTagInvokeName> <MTTagInvokeAttribute name="name">a</MTTagInvokeAttribute> </MTTagInvoke> "<MTGetVar name="a">"
これをスタティックなHTMLとして再構築した場合、表示は「""」と表示されます(変数aに「」(空の文字列)が代入されるため)。
しかしダイナミック・パブリッシングでは、「"これが表示されたらNG!"」と表示されてしまいます。
どちらでも正常に動作させるのは、明示的に空の <MTTagInvokeContent></MTTagInvokeContent> を入れる必要があります:
<$MTSetVar name="a" value="これが表示されたらNG!"$> <MTTagInvoke> <MTTagInvokeName>MTSetVarBlock</MTTagInvokeName> <MTTagInvokeAttribute name="name">a</MTTagInvokeAttribute> <MTTagInvokeContent></MTTagInvokeContent> </MTTagInvoke> "<MTGetVar name="a">"
また、オリジナルの(Perl版の)MTTagInvokeでは、<MTTagInvoke>~</MTTagInvoke>間の各タグ(<MTTagInvokeName>, <MTTagInvokeAttribute>, <MTTagInvokeContent>)の登場順序は不問(どの順番でも正常に処理されます)ですが、拙作のPHP版では<MTTagInvokeContent>の後に<MTTagInvokeName>や<MTTagInvokeAttribute>が現れた場合はその指定が反映されません。
例えば、以下のような記述を考えます。
<MTTagInvoke name="MTEntries"> <MTTagInvokeContent><$MTEntryTitle$></MTTagInvokeContent> <MTTagInvokeAttribute name="lastn">1</MTTagInvokeAttribute> </MTTagInvoke>
こちらもスタティックなHTMLとして再構築した場合、きちんと最新のエントリーのタイトルが1件のみ表示されます。
しかしダイナミック・パブリッシングでは、lastn="1" の指定が有効にならないため、表示可能なエントリーのタイトルがすべて表示されてしまいます。
どちらでも正常に動作させるには、<MTTagInvokeAttribute>を<MTTagInvokeContent>よりも先に記述する必要があります:
<MTTagInvoke name="MTEntries"> <MTTagInvokeAttribute name="lastn">1</MTTagInvokeAttribute> <MTTagInvokeContent><$MTEntryTitle$></MTTagInvokeContent> </MTTagInvoke>
前者は改善の余地がありますが、後者はPHP版プラグインの仕様上 回避困難(たぶん不可能)です。
ただ、通常は自然と上記2点に沿って記述すると思いますので、普通に使用する分には問題は起こらないと思われます。
もし「あれ? 期待通りに表示されないな?」と思ったら、これらの問題点を思い出していただければ幸いです。
著作権・ライセンスについて
※ただいま調査中です。
ソースそのものは、オリジナルの動作を完全にシミュレートする形で一から書き起こしていますので、著作権の侵害には当たらないと思われますが、ライセンスはオリジナルのものが適用される可能性があります。
詳細が判明次第、ここに追記いたします。
なお、こちらで公開しているPHPソースおよびそれを使用したことによる問題点や気づいた点に関して、原作者に直接問い合わせをしないでください。
この記事へのコメント、もしくはトラックバック等でお願いいたします。



