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" のような使い方をする場合は注意しましょう。