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検索結果画面のMTIncludeタグでファイルを読み込む方法
- Movable Typeの月別コンテンツアーカイブリスト用テンプレート
- コンテンツデータでMTEntriesWithSubCategoriesの代替テンプレートタグ
- MTContentFieldタグの使い方
- Movable Typeでブログ記事一覧をカスタムフィールドでソートする方法
- MTの本文フィールドからimg要素のURLを取得する方法
- MTEntriesタグで指定した数の記事を除外して表示する方法
- Movable Typeのテンプレートタグの中でテンプレートタグを使う方法
- Movable Typeのテンプレートタグをテンプレートで生成する方法
- Movable TypeのMTEntriesタグで特定の複数ブログ記事を出力する方法
- Movable TypeでCSVデータからtable要素を作る方法
- MTIncludeタグのnameモディファイア
- Movable Type(MT)の特殊変数の入れ子
- ブロックタグにelseタグを組み込んで判定する
- Movable Type 5 におけるウェブサイトとブログの複数指定方法