Japanese mtml guide 3 3 - movabletype/Documentation GitHub Wiki

配列、ハッシュ、<mt:loop>、<mt:for>

Back To Top

はじめに

今回は、配列とハッシュ、それから繰り返し処理を実現する <mt:loop> タグ、 <mt:for> タグをご紹介します。

配列

配列とは?

配列はプログラミング言語でよく利用され、インデックス(添え字、数字)で要素を区別するデータ構造です。

配列の作成方法

MTMLの中で配列を作成するのは幾つか方法があります。

foo[n] 形式での作成

<mt:Var name="foo[0]" value="ne">
<mt:Var name="foo[1]" value="ushi">
<mt:Var name="foo[2]" value="tora">

カンマ区切りでの作成方法

<mt:Var name="foo" value="ne","ushi","tora">

push() をつかった入力

<mt:Var name="push(foo)" value="ne" />
<mt:Var name="push(foo)" value="ushi" />
<mt:Var name="push(foo)" value="tora" />

配列の値取得方法

<mt:Var> による取得

<mt:Var name="foo[0]">

=> 出力
ne

<mt:loop> による取得

後述しますが、 <mt:loop> タグを用いて、配列の中身を出力する事が出来ます。

<mt:loop name="foo">
    <mt:Var name="__value__" />
</mt:loop>

=> 出力
ne ushi tora

ハッシュ

ハッシュとは?

ハッシュは連想配列と呼ばれ配列に近い動作をしますが、インデックスが数字以外も設定できるという点が異なります。

ハッシュの作成方法

MTMLの中でハッシュを作成するのは幾つか方法があります。

<mt:Var> による作成

<mt:Var name="bar{ne}" value="nezumi-doshi" />
<mt:Var name="bar{ushi}" value="ushi-doshi" />
<mt:Var name="bar{tora}" value="tora-doshi" />

<mt:SetHashVar> による作成

<mt:SetHashVar name="bar">
<mt:Var name="ne" value="nezumi-doshi">
<mt:Var name="ushi" value="ushi-doshi">
<mt:Var name="tora" value="tora-doshi">
</mt:SetHashVar>

ハッシュの値取得方法

<mt:Var> による取得

<mt:Var name="bar{ne}">

=> 出力
nezumi-doshi

<mt:loop> による取得

<mt:loop name="bar" sort_by="value">
    <mt:Var name="__key__" />: <mt:Var name="__value__" /><br />
</mt:loop>

=> 出力
ne: nezumi-doshi
tora: tora-doshi
ushi: ushi-doshi

<mt:loop>

<mt:loop>とは?

既に紹介済みですが、 <mt:loop> とは繰り返し処理を行う物です。

配列やハッシュを引数にすると、配列やハッシュの内容を元に色々な処理を行う事ができます。

<mt:Entries> や、 <mt:Blogs> なども含めて、繰り返し処理するブロックタグは <mt:loop> タグの機能を利用できます。

<mt:loop> の利用方法

単純な利用方法

上述した出力例のように配列やハッシュの内容を元にループ処理する事ができます。

応用的な利用方法

Movable Typeの再構築の処理を行う場合、データベースへのアクセスが多くなります。

例えばブログ記事のタイトル一覧をページ内で複数個所で利用するケースの場合、 <mt:Entries> タグを何箇所にも書くと、その個数分データベースへアクセスしに行く事になり再構築時にオーバーヘッドが多くなります。

そこで、一旦データを配列やハッシュに格納し、ループを各所でまわす事でデータベースへのアクセスを減らす事が可能となります。

<mt:Entries>
<mt:EntryTitle setvar="title" />
<mt:Var name="push(foo)" value="$title" />
</mt:Entries>

<mt:loop var=foo>
<mt:Var name="__value__"><br />
</mt:loop>

<mt:loop var="foo">
<mt:If name="__first__">
<ul>
</mt:If>
    <li><mt:Var name="__value__"></li>
<mt:If name="__last__">
</ul>
</mt:If>
</mt:loop>
​

この例では、 <mt:Entries> でブログ記事のタイトルを抽出し配列にセット、個別に2箇所で <mt:loop> を回しています。本来なら2回 <mt:Entries> を書くべき所を、1回で済ませています。これはデータベースへのアクセスが2回から1回へ減った事を示しています。

<mt:for>

<mt:for> とは?

<mt:loop> と同じく、繰り返し処理を行うタグです。まずはサンプルコードを見てください。

  • テンプレート
<mt:for var="x" from="5" to="10">
    <mt:if name="__first__"><p>初めてのループ</p></mt:if>
    <p>now x = <mt:var name="x"></p>
</mt:for>​
  • 出力結果
初めてのループ
now x = 5
now x = 6
now x = 7
now x = 8
now x = 9
now x = 10
  • from
    • ループ開始時の値を設定します。
  • to
    • 設定した値を超えた場合、ループは停止します。

つまり、5から10までの6回ループを回し、1回目の処理のときは「始めてのループ」と出力します。

特殊変数

<mt:loop><mt:for> などのループ処理を行うブロックタグには特殊変数があり利用する事が可能です。

  • __first__
    • ループ出力の最初である場合 true (1) となります。
  • __last__
    • ループ出力の最後である場合 ture (1) となります。
  • __odd__
    • ループ出力の奇数回目の場合 ture (1) となります。
  • __even__
    • ループ出力の偶数回目の場合 ture (1) となります。
  • __index__
    • ループのインデックスを格納します。
  • __counter__
    • ループした回数を格納します。

__index____counter__ 変数の違いは以下のサンプルで確認することができます。 __counter__ 変数は、ループした回数だけ1ずつ増えていきますが、 __index__ 変数の値は、 <mt:for> に設定した変数 test と同じループのインデックスを表示します。

  • 例)
<mt:for var="test" from="10" to="20" increment="2">
    <p>now test = <mt:var name="test"> | __index__: <MTVar name="__index__"> | __counter__: <MTVar name="__counter__"></p>
</mt:for>
  • 出力結果
now test = 10 | __index__: 10 | __counter__: 1
now test = 12 | __index__: 12 | __counter__: 2
now test = 14 | __index__: 14 | __counter__: 3
now test = 16 | __index__: 16 | __counter__: 4
now test = 18 | __index__: 18 | __counter__: 5
now test = 20 | __index__: 20 | __counter__: 6
  • この特殊変数を使う事で、CSSのクラスを変更し奇数行と偶数行でバックグラウンドの色を変更するといった処理も可能です。
<mt:Entries>
<mt:EntryTitle setvar="title" />
<mt:Var name="push(foo)" value="$title" />
</mt:Entries>

<mt:loop var="foo">
<mt:If name="__first__">
<ul>
</mt:If>
    <li class="<mt:If name="__odd__">odd-line<mt:Else>even-line</mt:If>"><mt:Var name="__value__"></li>
<mt:If name="__last__">
</ul>
</mt:If>
</mt:loop>
​

まとめ

今回はMTMLでもちょっと面倒な配列、ハッシュ、ループ処理について解説しました。

ループ処理は今回の例だけでなく、 <mt:Entries> などでも利用されており特殊変数も利用できることがあります。

テンプレートを記述するのに大事な内容ですので是非理解して活用してみてください。

Back To Top

⚠️ **GitHub.com Fallback** ⚠️