📃

【Movable Type】ブロックタグ内に利用できる予約変数について

に公開

概要

MT(PowerCMS含む、以下同)のブロックタグ内で利用できる予約変数について解説しています。

この予約変数はループ処理を行うブロックタグ内で利用できるもので、以下の6つを利用できます。

  • __first__:ループ処理の最初である場合にtrue
  • __last__:ループ処理の最後である場合にtrue
  • __odd__:ループ処理の奇数回数である場合にtrue
  • __even__:ループ処理の偶数回数である場合にtrue
  • __index__:ループ処理のインデックスを格納
  • __counter__:ループ処理の回数を格納

__first__ / __last__

ループ処理を行うMTブロックタグ内で、それぞれ以下である場合にtrueとなります。

  • __first__:ループ処理の最初(開始)である場合
  • __last__:ループ処理の最後(終了)である場合

MTIfタグやMTUnlessタグのnameモディファイアの値として利用することが多いです。

以下の例では、コンテンツタイプフィールドの「リスト」を出力しています。コンテンツタイプで設定したフィールドを出力(処理)するMTContentFieldは、ループ処理を行うブロックタグです。

<!-- MTML -->
<mt:ContentField content_field="リスト">
  <mt:If name="__first__">
    <ul>
  </mt:If>
      <li><mt:ContentFieldValue></li>
  <mt:If name="__last__">
    </ul>
  </mt:If>
</mt:ContentField>

<!-- 出力結果 -->
<ul>
  <li>リスト1</li>
  <li>リスト2</li>
  <li>リスト3</li>
</ul>

__first____last__の挙動は、リストを出力してみるとわかりやすいです。
上記の例では、ループ処理により出力されるのは<li><mt:ContentFieldValue></li>の部分ですが、その最初(開始)の処理として<ul>、最後(終了)の処理として</ul>をそれぞれ一度だけ出力されます。

__odd__ / __even__

ループ処理を行うMTブロックタグ内で、それぞれ以下である場合にtrueとなります。

  • __odd__:ループ処理の奇数回数(奇数番目)である場合
  • __even__:ループ処理の偶数回数(偶数番目)である場合

MTIfタグやMTUnlessタグのnameモディファイアの値として利用することが多いです。

以下の例では、記事一覧の出力において、表示が奇数番目の記事にはodd、偶数番目の記事にはevenというclass名をliタグに付与しています。

<!-- MTML -->
<mt:Entries lastn="5">
  <mt:EntriesHeader>
    <ul>
  </mt:EntriesHeader>
      <li class="item <mt:If name='__odd__'>odd<mt:ElseIf name='__even__'>even</mt:If>"><$mt:EntryDate format="%Y-%m-%d"$> <$mt:EntryTitle$></li>
  <mt:EntriesFooter>
    </ul>
  </mt:EntriesFooter>
</mt:Entries>

<!-- 出力結果 -->
<ul>
  <li class="item odd">2025-01-07 サンプル記事5</li>
  <li class="item even">2025-01-04 サンプル記事4</li>
  <li class="item odd">2025-01-03 サンプル記事3</li>
  <li class="item even">2025-01-01 サンプル記事2</li>
  <li class="item odd">2024-12-29 サンプル記事1</li>
</ul>

現在において、CSSで奇数番目・偶数番目の処理は:nth-child(odd)または:nth-child(even)と書けるので、上記はひと昔前によく書いていたコードですが、わかりやすいので例として挙げています。

__index__ / __counter__

ループ処理を行うMTブロックタグ内で、それぞれ以下を格納します。

  • __index__:ループ処理のインデックス
  • __counter__:ループ処理の回数

これまでの予約変数とは打って変わって、この2つはすこしイメージしづらいかもしれません。

__counter__の処理

順番が前後しますが、以下の例は記事一覧の出力において<mt:Var name="__counter__">を出力したものです。

<!-- MTML -->
<mt:Entries lastn="5">
  <mt:EntriesHeader>
    <ul>
  </mt:EntriesHeader>
      <li>[<$mt:Var name="__counter__"$>] <$mt:EntryDate format="%Y-%m-%d"$> <$mt:EntryTitle$></li>
  <mt:EntriesFooter>
    </ul>
  </mt:EntriesFooter>
</mt:Entries>

<!-- 出力結果 -->
<ul>
  <li>[1] 2025-01-07 サンプル記事5</li>
  <li>[2] 2025-01-04 サンプル記事4</li>
  <li>[3] 2025-01-03 サンプル記事3</li>
  <li>[4] 2025-01-01 サンプル記事2</li>
  <li>[5] 2024-12-29 サンプル記事1</li>
</ul>

<mt:Var name="__counter__">1を初期値として、ループ処理のたびに+1された値を格納して出力(処理)されます。古い記事(ループ出力があとのもの)ほど値が大きくなります。
__counter__MTVarでそのまま出力することもありますが、いったんMTSetVarで変数に格納してから利用することが多いです。

__counter__を利用した例として、以前以下の記事を書いているので、よかったらご参考ください。こちらは降順で連番を付与しています。

また、以下の記事では最後の出力件数の指定に__counter__を利用しています。

__index__の処理

__index__はそのまま<mt:Var name="__index__">としても値は出力(処理)されません。

<!-- MTML -->
<mt:Entries lastn="5">
  <mt:EntriesHeader>
    <ul>
  </mt:EntriesHeader>
      <li>[<$mt:Var name="__index__"$>] <$mt:EntryDate format="%Y-%m-%d"$> <$mt:EntryTitle$></li>
  <mt:EntriesFooter>
    </ul>
  </mt:EntriesFooter>
</mt:Entries>

<!-- 出力結果 -->
<ul>
  <li>[] 2025-01-07 サンプル記事5</li>
  <li>[] 2025-01-04 サンプル記事4</li>
  <li>[] 2025-01-03 サンプル記事3</li>
  <li>[] 2025-01-01 サンプル記事2</li>
  <li>[] 2024-12-29 サンプル記事1</li>
</ul>

MTForタグのループ内において、<mt:Var name="__index__">が出力されます。配列におけるインデックスです。

<!-- MTML -->
<mt:For var="num" to="5">
  <p>[<$mt:Var name="__index__"$>]: <$mt:Var name="num"$></p>
</mt:For>

<!-- 出力結果 -->
<p>[0]: 0</p>
<p>[1]: 1</p>
<p>[2]: 2</p>
<p>[3]: 3</p>
<p>[4]: 4</p>
<p>[5]: 5</p>

MTForはJavaScriptやPHPなどのfor文と同じような振る舞いをします。利用できるモディファイアなど詳細については、公式リファレンスをご確認ください。

公式リファレンス

MT

ブロックタグ内で利用できる予約変数について、最新のリファレンスページが見当たらなかったため、旧版のページにリンクしています。

PowerCMS

おしらせ(本記事の内容とは無関係です)

最後に宣伝となりますが、MENTAにてMovable Typeに関するご相談をお受けしています。ちょっとした疑問からそれなりにガッツリしたものまでご相談可能です。
お試しで低価格設定のものもありますので、もしよければご依頼ください。

https://menta.work/plan/17912

よろしくおねがいいたします。

Discussion