MTSetVarBlock と MTSetVarTemplate の違いについて

MTSetVarBlock と MTSetVarTemplate の違いについて

Posted at October 22,2007 12:50 AM
Tag:[MovableType, MTSetVarBlock, MTSetVarTemplate]
  • Hatena ブックマーク
  • del.icio.us
  • livedoor
  • Google Bookmarks
  • Yahoo!ブックマーク
  • POOKMARK Airlines
  • ニフティクリップ
  • Buzzurl
  • newsing it!

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 で振り分ける)

管理画面テンプレートは調査していないので、実際にはもう少し適正な使用方法があるかもしれません。

関連記事
トラックバックURL


コメントする
コメントするにはまずサインインしてください。
Loading...