Movable Type でテンプレートを書いているとき、カンマ区切りの文字列があって、これを配列にしてループさせたいってことは多々あるかと思います。 そんな時は、荒木さんの Split プラグイン(小粋空間)を使ったりしますが、プラグインを使えない環境もあるかもしれません。 そこで、今回はプラグインを使わないで、カンマ区切りの文字列を配列のようにループする方法を紹介します。...
Movable Type でテンプレートを書いているとき、カンマ区切りの文字列があって、これを配列にしてループさせたいってことは多々あるかと思います。
そんな時は、荒木さんの Split プラグイン(小粋空間)を使ったりしますが、プラグインを使えない環境もあるかもしれません。
そこで、今回はプラグインを使わないで、カンマ区切りの文字列を配列のようにループする方法を紹介します。
<$mt:SetVar name="favorite" value="バッジョ,ジーコ,クライフ,ピルロ,ストイコビッチ,グアルディオラ"$>
<$mt:Var name="favorite" regex_replace="/[^,]/g","" cat="," count_characters="1" setvar="length"$>
<mt:For var="i" from="1" to="$length">
<mt:If name="__first__"><ul></mt:If>
<$mt:Var name="favorite" regex_replace="/^([^,]+).*/","$1" setvar="value"$>
<$mt:Var name="favorite" regex_replace="/^([^,]+,?)(.*)/","$2" setvar="favorite"$>
<li><$mt:Var name="value"$></li>
<mt:If name="__last__"></ul></mt:If>
</mt:For>
まず、次のようなカンマ区切りの文字列を変数 favorite に入れておきます(変数名はご自由に)。
<$mt:SetVar name="favorite" value="バッジョ,ジーコ,クライフ,ピルロ,ストイコビッチ,グアルディオラ"$>
次に、このカンマ区切りの文字列の要素数を算出して、変数 length にセットします。
<$mt:Var name="favorite" regex_replace="/[^,]/g","" cat="," count_characters="1" setvar="length"$>
ここでの処理は次の順序で行っています。
次に、要素の数だけループする MTFor を用意します。
<mt:For var="i" from="1" to="$length">
</mt:For>
MTFor の中で、カンマ区切りの文字列の要素を一つずつ取り出していきます。
<mt:For var="i" from="1" to="$length">
<$mt:Var name="favorite" regex_replace="/^([^,]+).*/","$1" setvar="value"$>
<$mt:Var name="favorite" regex_replace="/^([^,]+,?)(.*)/","$2" setvar="favorite"$>
</mt:For>
ここでの処理は次の通りです。
なお、ダイナミックパブリッシングの場合は、置換文字列の部分 $1 を \$1 のようにエスケープします。
あとは、ループ内で、この変数 value を使って要素を出力すれば OK です。以下では、リストで出力しています。
<mt:For var="i" from="1" to="$length">
<mt:If name="__first__"><ul></mt:If>
<$mt:Var name="favorite" regex_replace="/^([^,]+).*/","$1" setvar="value"$>
<$mt:Var name="favorite" regex_replace="/^([^,]+,?)(.*)/","$2" setvar="favorite"$>
<li><$mt:Var name="value"$></li>
<mt:If name="__last__"></ul></mt:If>
</mt:For>
再利用性も考えて、以下のように、一度本当に配列にセットして、それをループで出力するという手もありますね。
<mt:For var="i" from="1" to="$length">
<$mt:Var name="favorite" regex_replace="/^([^,]+).*/","$1" setvar="value"$>
<$mt:Var name="favorite" regex_replace="/^([^,]+,?)(.*)/","$2" setvar="favorite"$>
<$mt:SetVar name="favorite_array" function="push" value="$value"$>
</mt:For>
<mt:Loop name="favorite_array">
<mt:If name="__first__"><ul></mt:If>
<li><$mt:Var name="__value__"$></li>
<mt:If name="__last__"></ul></mt:If>
</mt:Loop>
区切り文字がカンマ以外の場合
例えば区切り文字が「 AND 」(半角スペースAND半角スペース)のような場合は、最初に区切り文字を何かしらの1文字に置換して、それから同様にやればOKです。
以下では、「 AND 」を「@」に置換してから作業している例です。
<$mt:SetVar name="favorite" value="バッジョ AND ジーコ AND クライフ AND ピルロ AND ストイコビッチ AND グアルディオラ"$>
<$mt:Var name="favorite" regex_replace="/ AND /g","@" setvar="favorite"$>
<$mt:Var name="favorite" regex_replace="/[^@]/g","" cat="@" count_characters="1" setvar="length"$>
<mt:For var="i" from="1" to="$length">
<mt:If name="__first__"><ul></mt:If>
<$mt:Var name="favorite" regex_replace="/^([^@]+).*/","$1" setvar="value"$>
<$mt:Var name="favorite" regex_replace="/^([^@]+@?)(.*)/","$2" setvar="favorite"$>
<li><$mt:Var name="value"$></li>
<mt:If name="__last__"></ul></mt:If>
</mt:For>
以上です。