実行するテンプレートタグを変数で指定する

MTQに、「MTColor1/MTColor2/MTColor3の3つのカスタムフィールドを作ったときに、繰り返しを使って各カスタムフィールドの値を出力したい」といった内容の質問があがっていました。
すでにmtevalモディファイアで解決する方法が回答されていますが、プラグインを使う方法を紹介します。

1.mtevalモディファイアで処理する

ご質問のような事例の1つの解決方法は、mtevalモディファイアを使うことです。

1-1.mtevalモディファイアの動作

mtevalモディファイアは、テンプレートタグの値を出力する際に、その値をテンプレートとみなして、タグを再構築した結果を出力する働きをします。

たとえば、変数tmplの値が「<$mt:Color1$>」になっているとします。
この時に、「<$mt:GetVar name="tmpl" mteval="1"$>」のタグを実行するとします。
この場合、変数の値(<$mt:Color1$>)をテンプレートとみなして再構築し、結果としてMTColor1カスタムフィールドの値が出力されます。

1-2.変数にテンプレートタグを代入する

mtevalモディファイアを使う際には、変数にテンプレートタグを代入することがよくあります。
ただ、以下のようにして、変数にテンプレートタグそのものを直接に代入しようとしても、代入する前にそのテンプレートタグが再構築され、変数にはテンプレートタグの再構築結果が代入されてしまいます。

<mt:SetVarBlock name="tmpl"><$mt:Color1$></mt:SetVarBlock>

そこで、変数に代入する際に、「<」「>」をそれぞれ文字実体参照「&lt;」「&gt;」にしておきます。
そして、mtevalモディファイアを実行する前に、decode_htmlモディファイアで「<」「>」に戻すようにします。

<mt:SetVarBlock name="tmpl">&lt;$mt:Color1$&gt;</mt:SetVarBlock>
<$mt:GetVar name="tmpl" decode_html="1" mteval="1"$>

1-3.MTForタグと組み合わせる

あとは、MTForタグを使って、「mt:Color1」の最後の「1」を、「1」~「3」まで順に繰り返すようにします。
これで、MTColor1タグ~MTColor3タグを順に出力することができます。

<mt:For var="x" from="1" to="3">
  <mt:SetVarBlock name="tmpl">&lt;$mt:Color<$mt:GetVar name="x"$>$&gt;</mt:SetVarBlock>
  <$mt:GetVar name="tmpl" decode_html="1" mteval="1"$>
</mt:For>

2.プラグインで処理する

mtevalモディファイアを使う方法は、プラグインが不要である点がメリットです。
ただ、テンプレートタグを文字実体参照に置き換えることが必要で、テンプレートの可読性がやや下がるデメリットがあります。
そこで、プラグインで処理する方法を紹介します。

2-1.TagExecプラグイン

実行するテンプレートタグを変数で指定するプラグインとして、「TagExec」というものを作りました。
以前に「TagInvoke」というプラグインがありましたが、それと似た動作をします。

TagExecプラグインは、以下からダウンロードします。

TagExec_1_00.zip

ダウンロードしたZipファイルを解凍すると、「plugins」というフォルダができます。
このフォルダを、Movable Typeのインストール先ディレクトリにアップロードします。

2-2.TagExecプラグインで追加されるテンプレートタグ

TagExecプラグインをインストールすると、「MTTagExecBlock」「MTTagExecFunction」というテンプレートタグが追加されます。
それぞれ、実行するブロックタグ/ファンクションタグの名前を、「tagname」というモディファイアで指定します。
その際、タグ名の先頭の「MT」は、省略することができます。
また、MTTagExecBlock/MTTagExecFunctionタグとも、tagname以外のモディファイアを指定すると、実行するテンプレートタグに、そのモディファイアを引き継ぐことができます。

たとえば、以下のようなテンプレートがあるとします。

<mt:Entries lastn="5">
  <p><$mt:EntryTitle$>(<$mt:EntryDate format="%Y/%m/%d"$>)</p>
</mt:Entries>

このテンプレートのすべてのタグをMTTagExecBlock/MTTagExecFunctionタグで書き換えると、以下のようになります。

<mt:TagExecBlock tagname="Entries" lastn="5">
  <p><$mt:TagExecFunction tagname="EntryTitle"$>(<$mt:TagExecFunction tagname="EntryDate" format="%Y/%m/%d"$>)</p>
</mt:TagExecBlock>

また、上記のテンプレートで、tagnameモディファイアを「tagname="MTEntries"」などにしても動作します。

2-3.MTForタグと組み合わせる

MTTagExecFunctionタグとMTForタグを組み合わせることで、MTColor1/MTColor2/MTColor3のように、先頭部分が同じで最後が連番になっているテンプレートタグを、繰り返し実行することができます。
実際にその処理を書くと、以下のようになります。

<mt:For var="x" from="1" to="3">
  <mt:SetVarBlock name="tagname">Color<$mt:GetVar name="x"$></mt:SetVarBlock>
  <$mt:TagExecFunction tagname="$tagname"$>
</mt:For>

1行目のMTForタグで、変数xの値を1から3まで順に変化させながら繰り返します。
2行目のMTSetVarBlockタグで、変数tagnameに、「Color」の文字列と、変数xの値を連結した値(=「Color1」など)を代入します。
そして、3行目のMTTagExecFunctionタグで、変数tagnameの値(=「Color1」など)のテンプレートタグを実行します。

4.TagExecプラグインの制限事項

TagExecプラグインでは、tagnameモディファイアに条件判断系のタグを指定すると、正しく動作しない場合があります。