MTSetVarBlock と MTSetVarTemplate の違いについて
Category:[テンプレートタグ]
Tag:[MovableType, MTSetVarBlock, MTSetVarTemplate]
Movable Type 4 では、MTSetVar タグや MTSetVarBlock タグを用いた制御が数多く行われています。 本エントリーでは、新たに追加された MTSetVarTemplate タグについて解説します。
1.MTSetVarTemplate タグの機能
MTSetVarTemplate タグで囲まれた内容を、変数として値を設定します。
<MTSetVarTemplate name="foo">
<!-- do something -->
</MTSetVarTemplate>
なお、MTSetVarTemplate タグは、ドキュメントによれば MT 管理画面での使用が目的らしいので、ユーザのテンプレートで用いる可能性は低いかもしれません。
2.MTSetVarBlock タグとの違い
MTSetVarBlock タグは、ブロック内の内容が処理された結果を値として取得しますが、MTSetVarTemplate タグは、ブロックの内容が MTGetVar、あるいは MTVar タグで呼び出された時点ではじめて評価されます。
3.サンプル
ここでは MTIncludeタグ・MTGetVar タグと組み合わせた、MTSetVarBlock タグと MTSetVarTemplate タグの振舞いの違いを示したいと思います。
3.1 MTSetVarBlock + MTInclude + MTGetVar(OK)
MTSetVarTemplate タグは用いず、アーカイブテンプレートの MTInclude タグが実行された時点で MTEntries 全体が評価されるサンプルです。
アーカイブテンプレート
<$MTInclude module="test"$>
<$MTGetVar name="entries"$>
テンプレートモジュール(test)
<MTSetVarBlock name="entries">
<MTEntries>
<$MTEntryTitle$>
</MTEntries>
</MTSetVarBlock>
3.2 MTSetVarBlock + MTInclude + MTGetVar(NG)
アーカイブテンプレートの MTInclude で MTEntryTitle が評価されますが、評価時点では MTEntryTitle が MTEntries コンテキスト外のため、再構築エラーとなるサンプルです。
アーカイブテンプレート
<$MTInclude module="test"$>
<MTEntries>
<$MTGetVar name="entries"$>
</MTEntries>
テンプレートモジュール(test)
<MTSetVarBlock name="entries">
<$MTEntryTitle$>
</MTSetVarBlock>
3.3 MTSetVarTemplate + MTInclude + MTGetVar(OK)
3.2項の MTSetVarBlock タグを MTSetVarTemplate タグに置き換えることで、アーカイブのMTInclude 時点でMTEntryTitleは評価されず、MTGetVar(=MTEntires ブロック内)で評価されるので、期待通りの動作になります。
アーカイブテンプレート
<$MTInclude module="test"$>
<MTEntries>
<$MTGetVar name="entries"$>
</MTEntries>
テンプレートモジュール(test)
<MTSetVarTemplate name="entries">
<$MTEntryTitle$>
</MTSetVarTemplate>
4.参考:MT4 のデフォルトテンプレート
3項でサンプルをいくつか比較しましたが、実際には、デフォルトテンプレートの MTEntries 関連のタグデザインは下記の通りです。
MTGetVar は用いず、アーカイブテンプレートの MTEntries ブロックに直接 MTInclude が記述され、MTEntryTitleが評価されます。
アーカイブテンプレート
<MTEntries>
<$MTInclude module="test"$>
</MTEntries>
テンプレートモジュール(test)
<$MTEntryTitle$>
5.まとめ
MTSetVarTemplate を用いるケースとして、下記が考えられます。
- テンプレートモジュールをひとつにまとめたい
- ブロックタグとファンクションタグのテンプレートを分離したい
- ファンクションタグのテンプレートモジュールに、複数のバリエーションをもたせる(MTGetVar で振り分ける)
管理画面テンプレートは調査していないので、実際にはもう少し適正な使用方法があるかもしれません。
- Movable Type のブロックタグにファンクションタグで使うモディファイアを指定する
- EntryCategoryID プラグイン
- MTIf タグの test モディファイアで Perl の式を利用する
- MTIf タグの tag モディファイアでテンプレートタグの値を直接参照する
- MTLoop タグによる配列変数・ハッシュ変数の制御
- Movable Type 4.1 / MTOS における変数での算術演算子の利用方法
- Movable Type 4.1 / MTOS における配列とハッシュの利用方法
- サイドバーの表示をメインページと同じにする
- MTIf タグの like 属性について
- strip 属性で日付の空白を削除する
- MTIgnore タグ
- エントリーで table タグを記述する場合の注意
- MTLink によるページ作成
- Movable Type のディレクトリ
- 全エントリーリスト・全コメントリスト・全トラックバックリストを表示
- カテゴリーアーカイブで MTCategoryDescription をタイトルに使う
- 「最近のエントリー」の日別表示
- コメント投稿者の情報表示をカスタマイズする
- MTCommentPreviewIsStatic の振る舞いについての改善案

