Movable Type6.3 の MTViewer(MTタグをPHPコードの中でビルドする)
公開日 : 2016-08-31 14:14:30
先日、Movable Type6.3がリリースされました。
一番の変更点はダイナミックパブリッシングのPHP7サポートですが、内部的には Smartyのバージョンが2系から3系に変更になっています(PowerCMS/DynamicMTMLの対応は少々お待ち下さい)。
PHP 7 をサポート
PHP 7 を正式にサポートしました。PHP 7 は、PHP 5系と比べてもパフォーマンスの向上が期待できます。
Smarty 3.1 へアップデート
PHP 7 への対応に伴い、Smarty 2 から Smarty 3 へのアップデートされました。
プラグイン開発者へ
ダイナミック・パブリッシングに対応したプラグインについて、直接 Smarty を操作していないかぎりにおいて変更の必要は無いものと想定していますが、動作確認等よろしくお願いいたします。
※(再度) PowerCMS/DynamicMTMLの対応は少々お待ち下さい
MTViewerとは、$ctx であり Smartyである
何のことか分かる人にしかわからないアレゲな書き方ですが、つまるところMTにおけるダイナミック・パブリッシングとはMTのテンプレートをSmartyテンプレートにコンバートしてビルドするという仕組みになっています。実体は mt/php/lib/MTViewer.php です。
この MTViewerクラスの fetchメソッドがテンプレートをビルドするコードなのですが、MTタグをPHPの中で動的にビルドする方法について備忘録がてらメモしておきます。ちなみに、元がSmartyですので、これらはSmartyのテンプレートを渡しても動作します。MTテンプレートを指定した場合、mt/php/lib/prefilter.mt_to_smarty.php がMTのテンプレートをSmartyのテンプレートに変換してからビルドされます。というわけでMTViewerクラスの fetchメソッドにはMTタグをそのまま渡せるのです。
MTテンプレートをPHPコードの中でビルドする
念のためですが、$ctx の初期化については下記の記事を参照ください。
template_id 指定でビルド
$mt = MT::get_instance();
$ctx =& $mt->context();
$str = $ctx->fetch("mt:123");
テンプレート名(template_name) 指定でビルド
$mt = MT::get_instance();
$ctx =& $mt->context();
$str = $ctx->fetch("mt:テンプレート名");
テンプレート指定のビルドについては mt/php/lib/resource.mt.php で定義されています(Smartyのカスタムリソース)。 Smartyのカスタムリソースの作り方は以下のページに。カスタムリソースを作成すれば、例えば S3 に置いたMTテンプレートを指定してビルド、とかまぁ色々できるわけですね。
MTテンプレート文字列指定でビルド
$mt = MT::get_instance();
$ctx =& $mt->context();
$str = $ctx->fetch("eval:<mt:Date>");
ファイルパス指定でビルド
$mt = MT::get_instance();
$ctx =& $mt->context();
$str = $ctx->fetch("file:/path/to/tmpl.tpl");
テンプレート変数をセットしてビルド
$mt = MT::get_instance();
$ctx =& $mt->context();
$ctx->__stash[ 'vars' ][ 'foo' ] = 'bar';
$str = $ctx->fetch('eval:<mt:Var name="foo">');
記事コンテキストをセットしてビルド
$mt = MT::get_instance();
$ctx =& $mt->context();
$entry = $mt->db()->fetch_entry( 1 );
$ctx->stash( 'entry', $entry );
$str = $ctx->fetch('eval:<mt:EntryTitle>');
この辺りを理解しておくと、PHPでサイトを拡張していく際にMTテンプレートが活用できるようになります。例えばPHPで作成したフォームメールのテンプレートにMTタグを使ったり。ということでMT6.3の Tips でした。