13 May 2011
MovableTypeのダイナミックパブリッシングでPHPを使う
Category : Diary
< コメントする >
ニッチな内容ですが、他にも同じ情報を探している人がいるかもしれないので書いてみました。2011年5月現在、オレが使っているMovable Typeのバージョンは4.2xです。
Movable Typeはダイナミックパブリッシング(動的生成)を行うためにSmarty(PHP)というテンプレートエンジンを使っています。「本体をPerlで書いてるんだから全部Perlにすりゃいいのに!」というのはひとまずおいときましょう。
で、ダイナミックパブリッシングで運用するとSmartyの初期設定が邪魔をしてMTのテンプレートに書いたPHPのコードが実行されません。
とりあえずテンプレート内のPHPコードを実行可能にする
これをクリアするのは割と簡単で、Smarty実行時に参照される環境変数の値を変更するだけで実行が可能になります。環境変数は、
MTインストールディレクトリのphp/extlib/smarty/libs/Smarty.class.phpに書かれています。
この中の環境変数
var $php_handling = SMARTY_PHP_PASSTHRU;
を
var $php_handling = SMARTY_PHP_ALLOW;
と書き換えてやれば、テンプレート内に書いたPHPコードの実行が可能になります。
ファンクションタグの値をPHPで使う
さて、ダイナミックパブリッシングでPHPコードが動くとなればファンクションタグの値を取得してコネコネしたくなるってもんですが一筋縄では行きません。スタティックの場合は簡単に出来るんですけどね。
が、一手間かけたらあっさり出来てしまいました。ファンクションタグの値をSamrtyの変数に入れてそれをPHPコードから参照するという方法です。
まずはファンクションタグの値をSmartyの変数に入れる方法。エントリーIDを例にしてみます。
{{capture assign="entryID"}}<mt:entryid>{{/capture}}
これでentryIDというSmarty変数にmt:entyridの値が格納されました。
次はPHPコードで変数$entryIDに先ほどのSmarty変数入れてみます。
<?php
$entryID = $this->get_template_vars('entryID');
?>
こうする事でダイナミックパブリッシング運用時にPHPコード内でファンクションタグの値を参照して利用する事が可能になります。ただ、グローバルテンプレートなんかに切り出してしまうとエラーになります。(どういうケースでエラーになるかは確認していません)
込み入った事をやるのは気が引けますが、エントリーの日付を取得して「Update」とか「NEW!」なんて表示したり、ある程度の期間が過ぎたエントリーのコメントフォームを非表示にするとか、ちょっとした小技が使えるようになります。
プラグインを使う・作る、Perlでカスタマイズする方法もありますが、テンプレート内にちゃちゃっと書いてしまえばある程度の機能を実現できるのでこういう選択肢もありかなと思います。
13 May 2011
Category : Diary
---

Comment
コメントはありません
Comment Form
※ コメントは認証後に公開されます。