Japanese mtml guide 3 3 - Hiranyaloka/Documentation GitHub Wiki
今回は、配列とハッシュ、それから繰り返し処理を実現する <mt:loop> タグ、 <mt:for> タグをご紹介します。
配列はプログラミング言語でよく利用され、インデックス(添え字、数字)で要素を区別するデータ構造です。
MTMLの中で配列を作成するのは幾つか方法があります。
<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">
<mt:Var name="push(foo)" value="ne" /> <mt:Var name="push(foo)" value="ushi" /> <mt:Var name="push(foo)" value="tora" />
<mt:Var name="foo[0]"> => 出力 ne
後述しますが、 <mt:loop> タグを用いて、配列の中身を出力する事が出来ます。
<mt:loop name="foo">
<mt:Var name="__value__" />
</mt:loop>
=> 出力
ne ushi tora
ハッシュは連想配列と呼ばれ配列に近い動作をしますが、インデックスが数字以外も設定できるという点が異なります。
MTMLの中でハッシュを作成するのは幾つか方法があります。
<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 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 name="bar{ne}">
=> 出力
nezumi-doshi
<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:Entries> や、 <mt:Blogs> なども含めて、繰り返し処理するブロックタグは <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: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> などでも利用されており特殊変数も利用できることがあります。
テンプレートを記述するのに大事な内容ですので是非理解して活用してみてください。
- 1. ウィジェット
- 2. MTML(初級編)
- 3. MTML(応用編)
- カスタムフィールド
- <mt:If> の活用方法
- 配列、ハッシュ、<mt:loop>、<mt:for>