繰り返しを途中で抜ける

昨日公開したプラグインを使うと、繰り返しを途中で抜けるようなテンプレートを組むこともできます(ただし、あまりエレガントではありません)。

1.考え方

多くのプログラム言語では、繰り返しを途中で中断して繰り返しから抜ける命令があります。
Perlならlastですし、PHPやJavaScriptならbreakです。

本当なら、lastやbreakに相当することを、テンプレートタグ1つでできるようにしたいところです。
ただ、Movable Typeのコアのテンプレート解析処理を見た限りでは、lastやbreakに相当するテンプレートタグを作ることはできなさそうでした。

そこで、MTUntilタグと条件判断を組み合わせて、以下のような方法でlast等に相当する処理を行うようにします。

  • 途中で抜けることを表すために、フラグの変数を1つ用意し、その値を0(偽)にしておきます。
  • MTUntilタグに「name="フラグ変数名"」のモディファイアを指定し、フラグ変数の値が真になったら繰り返しを終えるようにします。
  • MTUntilタグのブロックの中で、繰り返しから脱出するかどうかをMTIfタグで判断します。
  • 条件が成立したら、フラグ変数の値を1(真)にします。
  • 条件が成立しなかったら、繰り返しの続きの処理を行います。

2.テンプレートの組み方

ここまでの話に基づいて、実際にテンプレートを組むと、以下のようになります。
フラグ変数の名前を「flag」にしています。

<$mt:SetVar name="flag" value="0"$>
<mt:Until name="flag">
  繰り返し処理の前半
  <mt:If 条件>
    <$mt:SetVar name="flag" value="1"$>
  <mt:Else>
    繰り返し処理の後半
  </mt:If>
</mt:Until>

3.例

以下のリストは、繰り返しの5回目になったら(変数__counter__の値が5になったら)、繰り返しを抜けて、繰り返しの後半の処理を行わないようにする例です。

<$mt:SetVar name="flag" value="0"$>
<mt:Until name="flag">
  <$mt:GetVar name="__counter__"$>回目の繰り返し処理の前半
  <mt:If name="__counter__" eq="5">
    <$mt:SetVar name="flag" value="1"$>
  <mt:Else>
    <$mt:GetVar name="__counter__"$>回目の繰り返し処理の後半
  </mt:If>
</mt:Until>

このテンプレートを再構築すると、以下のような出力が得られます(実際には、スペースや改行が含まれます)。
5回目の繰り返し処理の後半が行われず、繰り返しから途中で抜ける形になっていることが分かります。

1回目の繰り返し処理の前半
1回目の繰り返し処理の後半
2回目の繰り返し処理の前半
2回目の繰り返し処理の後半
3回目の繰り返し処理の前半
3回目の繰り返し処理の後半
4回目の繰り返し処理の前半
4回目の繰り返し処理の後半
5回目の繰り返し処理の前半