サイト制作に関するメモ書き

HOME > CMS > Movable Type > MTLoopとMTForを使ってみる

MTLoopとMTForを使ってみる

Movable Typeで繰り返し処理を行えるMTLoopとMTForを試してみます。

MTLoop

まずはMTLoopを使ってみます。
MTLoopはハッシュや配列を指定して、その内容で繰り返し処理ができます。

MTSetVarでハッシュ変数を設定して、MTLoopで処理してみます。

<mt:SetHashVar name="wataten">
<mt:SetVar name="hana" value="白咲 花">
<mt:SetVar name="hinata" value="星野 ひなた">
<mt:SetVar name="noa" value="姫坂 乃愛">
</mt:SetHashVar>
<ul>
  <mt:Loop name="wataten">
    <li>
      __first__:<mt:Var name="__first__">
      __last__:<mt:Var name="__last__">
      __odd__:<mt:Var name="__odd__">
      __even__:<mt:Var name="__even__">
      __key__:<mt:Var name="__key__">
      __value__:<mt:Var name="__value__">
    </li>
  </mt:Loop>
</ul>

再構築を行うと、以下のように生成されます。

<ul>
    <li>
      __first__:1
      __last__:
      __odd__:1
      __even__:
      __key__:hana
      __value__:白咲 花
    </li>
    <li>
      __first__:
      __last__:
      __odd__:
      __even__:1
      __key__:noa
      __value__:姫坂 乃愛
    </li>
    <li>
      __first__:
      __last__:1
      __odd__:1
      __even__:
      __key__:hinata
      __value__:星野 ひなた
    </li>
</ul>

上記で試したように、MTLoop内では特別な変数を使用できます。

__first__ ループの最初である場合に1(true)になる。
__last__ ループの最後である場合1(true)になる。
__odd__ ループの奇数番目である場合に1(true)になる。
__even__ ループの偶数番目である場合に1(true)になる。
__key__ 現在のキー名を表示。
__value__ 現在の値を表示。

先ほどはハッシュを試したので、配列でも同様に試してみます。

<mt:SetVarBlock name="wataten" index="0">白咲 花</mt:SetVarBlock>
<mt:SetVarBlock name="wataten" index="1">星野 ひなた</mt:SetVarBlock>
<mt:SetVarBlock name="wataten" index="2">姫坂 乃愛</mt:SetVarBlock>
<ul>
  <mt:Loop name="wataten">
    <li>
      __first__:<mt:Var name="__first__">
      __last__:<mt:Var name="__last__">
      __odd__:<mt:Var name="__odd__">
      __even__:<mt:Var name="__even__">
      __key__:<mt:Var name="__key__">
      __value__:<mt:Var name="__value__">
    </li>
  </mt:Loop>
</ul>

再構築を行うと、以下のように生成されます。

<ul>
    <li>
      __first__:1
      __last__:
      __odd__:1
      __even__:
      __key__:
      __value__:白咲 花
    </li>
    <li>
      __first__:
      __last__:
      __odd__:
      __even__:1
      __key__:
      __value__:星野 ひなた
    </li>
    <li>
      __first__:
      __last__:1
      __odd__:1
      __even__:
      __key__:
      __value__:姫坂 乃愛
    </li>
</ul>

配列はハッシュと違いキーがないため、再構築すると__key__は表示されません。

最後にモディファイアの中からsort_byを使ってみます。
sort_byにkeyを指定するとキーの文字列で、valueを指定すると値の文字列で並び替えます。
またreverseを併用すると、並び順を逆にできます。

<mt:SetHashVar name="wataten">
<mt:SetVar name="hana" value="白咲 花">
<mt:SetVar name="hinata" value="星野 ひなた">
<mt:SetVar name="noa" value="姫坂 乃愛">
</mt:SetHashVar>
<ul>
  <mt:SetVar name="counter" value="0">
  <mt:Loop name="wataten" sort_by="key reverse">
    <li>
      counter:<mt:Var name="counter">
      __key__:<mt:Var name="__key__">
      __value__:<mt:Var name="__value__">
    </li>
    <mt:SetVar name="counter" op="inc">
  </mt:Loop>
</ul>

再構築を行うと、以下のように生成されます。

<ul>
    <li>
      counter:0
      __key__:noa
      __value__:姫坂 乃愛
    </li>
    <li>
      counter:1
      __key__:hinata
      __value__:星野 ひなた
    </li>
    <li>
      counter:2
      __key__:hana
      __value__:白咲 花
    </li>
</ul>

 

MTFor

次にMTForを使ってみます。
MTForは一般的なプログラミング言語にあるforと同じで、指定した数値の範囲内で繰り返し処理ができます。

<ul>
  <mt:For var="i" from="2" to="4">
    <li>
      i:<mt:Var name="i">
      __first__:<mt:Var name="__first__">
      __last__:<mt:Var name="__last__">
      __odd__:<mt:Var name="__odd__">
      __even__:<mt:Var name="__even__">
      __index__:<mt:Var name="__index__">
      __counter__:<mt:Var name="__counter__">
    </li>
  </mt:For>
</ul>

再構築を行うと、以下のように生成されます。

<ul>
    <li>
      i:2
      __first__:1
      __last__:
      __odd__:1
      __even__:
      __index__:2
      __counter__:1
    </li>
    <li>
      i:3
      __first__:
      __last__:
      __odd__:
      __even__:1
      __index__:3
      __counter__:2
    </li>
    <li>
      i:4
      __first__:
      __last__:1
      __odd__:1
      __even__:
      __index__:4
      __counter__:3
    </li>
</ul>

MTLoopの時と同様に、MTFor内では特別な変数を使用できます。
__first__、__last__、__odd__、__even__についてはMTLoopで説明しているので省きます。

__index__ 現在のインデックスを表示。
__counter__ 現在のループ回数を表示。

__index__と__counter__の違いは上記サンプルを見ればわかると思いますが、__index__はvarで設定している変数(上記サンプルの場合はi)の値、__counter__はループ自体の回数になります。

ループごとに増加する数値を指定できるincrementを使ってみます。

<ul>
  <mt:For var="i" from="0" to="7" increment="3">
    <li>i:<mt:Var name="i"></li>
  </mt:For>
</ul>

デフォルトだと1ずつ増加しますが、3ずつ増加するようになりました。

<ul>
    <li>i:0</li>
    <li>i:3</li>
    <li>i:6</li>
</ul>
<ul>

最後に配列をMTForで処理してみます。

<mt:SetVarBlock name="wataten" index="0">白咲 花</mt:SetVarBlock>
<mt:SetVarBlock name="wataten" index="1">星野 ひなた</mt:SetVarBlock>
<mt:SetVarBlock name="wataten" index="2">姫坂 乃愛</mt:SetVarBlock>
<ul>
  <mt:SetVarBlock name="charaCount"><mt:Var name="wataten" function="count" op="dec"></mt:SetVarBlock>
  <mt:For var="i" from="0" to="$charaCount">
    <li><mt:Var name="wataten" index="$i"></li>
  </mt:For>
</ul>

ポイントとしてはMTForのtoの値を配列の個数-1にしている点です。
変数内の配列の個数はMTVarのcount関数で取得でき、さらにopモディファイアの演算で-1しています。

再構築を行うと、以下のように生成されます。

<ul>
    <li>白咲 花</li>
    <li>星野 ひなた</li>
    <li>姫坂 乃愛</li>
</ul>

 

【参考サイト】

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

▲PAGE TOP