MTIf タグを tag モディファイアと共に使う際の注意点をご紹介します。
今回のケースはレアかもしれませんが、複雑なテンプレートを書くときにひょっとしたら陥るかも?という注意点をご紹介します。
はじめに下記のようなシンプルなグローバルテンプレート作成します。
<mt:SetVar name="hello" value="こんにちは" append="1" />
<mt:Var name="hello" />
このテンプレートを任意のサイトのインデックステンプレートで読み込みます。
<mt:Include module="message" global="1" />
このテンプレートを再構築すると下記のように表示されます。
こんにちは
message
グローバルテンプレートの名前を「 _message
」に変更します。先ほどのインデックステンプレートを再構築すると、テンプレートが見つかりませんというエラーになります。
インクルードするテンプレートの存在が不確かなときは下記のようにして mt:If tag=""
で囲ってあげれば、そのテンプレートが存在しない場合にはエラーになりません。
<mt:If tag="Include" module="message">
<mt:Include module="message" global="1" />
</mt:If>
ここまでは特に問題ありませんが、問題はテンプレートが存在するときです。先ほど「 _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
タグが評価された時点で定義された message
に append
されてしまうわけです。
このようなケースはレアでしょうが、mt:If tag="Include"
のような使い方をする場合は注意しましょう。