MTSetVarBlockタグの落とし穴

Movable Type 4では、テンプレート内で変数を使う機能が強化されていて、変数の値で条件判断を行って出力内容を変えるなどのことができます。

変数を使う際には、テンプレートタグの再構築結果を変数に代入するために、「MTSetVarBlock」というタグを使うことがよくあります。
しかし、このタグには「改行」の落とし穴があります。
この落とし穴にはまる方が結構いるようですので、対処法を解説します。

1.改行が問題になる例

まず、ブログ記事リストテンプレートで、以下のようにタグを組むとします。
「hoge」という名前のカテゴリーだけ、出力する内容を変えようというものです。

<MTSetVarBlock name="catlabel">
<$MTCategoryLabel$>
</MTSetVarBlock>

<MTIf name="catlabel" eq="hoge">
カテゴリー名がhogeの時に出力する内容
<MTElse>
それ以外の時に出力する内容
</MTIf>

ところが、このタグの書き方では、思い通りの動作にはなりません。
この書き方だと、MTSetVarBlockの後の改行と、MTCategoryLabelタグの後の改行も、変数catlabelに代入されます。
つまり、変数の値は、「改行」+「カテゴリー名」+「改行」のような文字列になります。

hogeカテゴリーのページを再構築したときには、変数catlabelの値は「改行hoge改行」になります。
それをMTIfタグで「hoge」と比較しても、「一致していない」と判断されることになります。
その結果、思い通りの出力になりません。

2.MTSetVarBlockタグの中では改行を使わない

MTSetVarBlockタグを使って、テンプレートタグの値を変数に代入する場合は、MTSetVarBlockタグのブロックの中に改行を入れないようにします。
前述の例だと、以下のように書き換えれば、思い通りの動作になります。

<MTSetVarBlock name="catlabel"><$MTCategoryLabel$></MTSetVarBlock>

<MTIf name="catlabel" eq="hoge">
カテゴリー名がhogeの時に出力する内容
<MTElse>
それ以外の時に出力する内容
</MTIf>

3.変数内の改行を調べる

ある変数の中に改行が含まれているかどうかを確認するには、変数に値を代入する行の後に、以下のような行を入れてみると良いでしょう。
これは、変数の中の改行を「[br]」に置換して、HTMLのコメントにして出力するものです。

<!-- 変数名 = <MTVar name="変数名" regex_replace="/\n/g","[br]"> -->

例えば、変数fooに改行が含まれているかどうかを調べたい場合は、以下のようにします。

<!-- foo = <MTVar name="foo" regex_replace="/\n/g","[br]"> -->