MTIf タグの使い方の注意点

今回のケースはレアかもしれませんが、複雑なテンプレートを書くときにひょっとしたら陥るかも?という注意点をご紹介します。

STEP 1

はじめに下記のようなシンプルなグローバルテンプレート作成します。

<mt:SetVar name="hello" value="こんにちは" append="1" />
<mt:Var name="hello" />

STEP 2

このテンプレートを任意のサイトのインデックステンプレートで読み込みます。

<mt:Include module="message" global="1" />

このテンプレートを再構築すると下記のように表示されます。

こんにちは

STEP 3

message グローバルテンプレートの名前を「 _message 」に変更します。先ほどのインデックステンプレートを再構築すると、テンプレートが見つかりませんというエラーになります。

STEP 4

インクルードするテンプレートの存在が不確かなときは下記のようにして mt:If tag="" で囲ってあげれば、そのテンプレートが存在しない場合にはエラーになりません。

<mt:If tag="Include" module="message">
  <mt:Include module="message" global="1" />
</mt:If>

STEP 5

ここまでは特に問題ありませんが、問題はテンプレートが存在するときです。先ほど「 _message 」に変更したテンプレート名を「 message 」に戻して、インデックステンプレートを再構築します。

すると、下記のように表示されます。

こんにちはこんにちは

理由

MT のソースコードまでは見ていませんが、まず最初の <mt:If tag="Include" module="message"> の段階で mt:Include タグが評価されるので、モジュールが存在する場合はそのモジュールの中身のテンプレートも評価されます。

今回の例で言うと、message モジュールの中の <mt:SetVar name="hello" value="こんにちは" append="1" /> が評価された時点で hello 変数が定義されます。

その後、mt:If タグの中の <mt:Include module="message" global="1" /> で再度 message モジュールの中身が評価され、append="1" が付いているため、先に mt:If タグが評価された時点で定義された messageappend されてしまうわけです。

このようなケースはレアでしょうが、mt:If tag="Include" のような使い方をする場合は注意しましょう。