MTLoop タグによる配列変数・ハッシュ変数の制御

MTLoop タグによる配列変数・ハッシュ変数の制御

Posted at December 27,2007 1:35 AM
Tag:[MovableType, MTLoop]

Movable Type 4.0 では管理画面用だった MTLoop タグが、Movable Type 4.1 ではテンプレート上で利用できるようになりました。これにより配列やハッシュの取得が MTLoop タグで実現できるようになります。

以下、MTLoop での配列とハッシュの利用方法を紹介します。

1.配列を取得する

MTFor タグで設定し、MTLoop タグで取得するサンプルを示します。

<mt:for var="i" from="0" to="9">
    <mt:setvar name="foo[$i]" value="$i">
</mt:for>
 
<mt:loop name="foo">
    <mt:getvar name="__value__">
</mt:loop>

MTLoop タグの使い方は、name モディファイアに配列変数名を設定するだけで、ここでは foo を設定しています。

配列変数 foo の値は予約変数 __value__ に自動的に設定されるので、あとは MTGetVar タグの name モディファイアに指定するだけです。

MTLoop タグの部分を MTFor タグで書くと

<mt:for var="i" from="0" to="9">
    <mt:setvar name="foo[$i]" value="$i">
</mt:for>

となるので、MTLoop タグの方が簡単に書けることがお分かりになると思います。

なお、MTLoopタグでは配列のインデックスが0から処理が開始されるため、設定側の MTFor タグの from モディファイアは「0」、to モディファイアは「9」を設定しています。

2.ハッシュを取得する

4.1 ベータ 2 から新しく追加された sethashvar タグ(ハッシュをまとめて定義できるタグ)を用いて、ハッシュを作成し、MTLoop タグで取得するサンプルを示します。

<mt:sethashvar name="week">
<mt:setvar name="mon" value="Monday">
<mt:setvar name="tue" value="Tuesday">
<mt:setvar name="wed" value="Wednesday">
<mt:setvar name="thu" value="Thursday">
<mt:setvar name="fri" value="Friday">
<mt:setvar name="sat" value="Saturday">
<mt:setvar name="sun" value="Sunday">
</mt:sethashvar>
 
<mt:loop name="week">
    <$mt:getvar name="__key__"$> <$mt:getvar name="__value__"$>
</mt:loop>

テンプレートを再構築すると、下のように出力されます。

sun Sunday
fri Friday
tue Tuesday
sat Saturday
mon Monday
wed Wednesday
thu Thursday

配列変数の時と同様、name モディファイアに配列変数名を設定します。ここでは week を設定します。

配列変数 week のキーの値は予約変数 __key__ に、キーに対応する値は予約変数 __value__ に自動的に設定されるので、それぞれ MTGetVar タグの name モディファイアに指定します。

ハッシュは配列のような順序性がありませんが、sort_by モディファイアを設定することで、一定の規則にしたがって出力されます。

キーの文字列順で並べ替え

<mt:loop name="[変数名]" sort_by="key">

キーの文字列順(逆順)で並べ替え

<mt:loop name="[変数名]" sort_by="key reverse">

キーに対応する値の文字列順で並べ替え

<mt:loop name="[変数名]" sort_by="value">

キーに対応する値の文字列順(逆順)で並べ替え

<mt:loop name="[変数名]" sort_by="value reverse">

キーに対応する値の文字を数値として比較・並べ替え

<mt:loop name="[変数名]" sort_by="value numeric">

キーに対応する値の文字を数値として比較・並べ替え(逆順)

<mt:loop name="[変数名]" sort_by="value numeric reverse">
関連記事
zenback
人気エントリー
トラックバックURL


コメント

この記事とは全然関係ないですが、cormun rizer のページが開けないのですが、こちらの不具合でしょうか?

[1] Posted by まさあき : December 27, 2007 8:58 AM

>まさあきさん
こんにちは。
ご質問の件につきまして、申し訳ありませんがIE以外のブラウザ(Firefox/Opera等)でお試し頂けますでしょうか(IEではサーバ移転後にページが開けなくなってしまっていますが、解析時間がとれていません)。
それではよろしくお願い致します。

[2] Posted by yujiro logo : December 28, 2007 1:32 PM

はじめまして。
ハッシュをkeyの順に並べ替え、並べ替えたものを配列の値を
配列の先頭から指定した数だけ取得するといった事は可能なのでしょうか?

MTLoopでkeyの順に並べた後に

<MTIf var="i" from="0" to="6">
<$MTVar name="[変数名]" index="$i"$>
</MTIf>

で値を取得しようとしたのですが上手くいかず

値を取得する方法をご教授頂ければと思いコメントさせて頂きました。

[3] Posted by kiki : July 23, 2008 6:09 PM

すみません。
上のコメントの修正と自己解決です。
修正

<MTIf var="i" from="0" to="6">
<$MTVar name="[変数名]" index="$i"$>
</MTIf>


<MTFor var="i" from="0" to="6">
<$MTVar name="[変数名]" index="$i"$>
</MTFor>

お恥ずかしい...

自己解決
MTLoop内で新たな配列を作り上手く表示ができました。
<MTLoop name="[変数名]" sort_by="key reverse">
<MTSetVarBlock name="push([変数名2])">
<$MTVar name="__value__"$>
</MTSetVarBlock>
</MTLoop>

<MTFor var="i" from="0" to="6">
<$MTVar name="[変数名2]" index="$i"$>
</MTFor>

もっと効率的な方法もあるとは思いますが...

[4] Posted by kiki : July 23, 2008 6:47 PM

>kikiさん
こんばんは。
ご連絡ありがとうございました。
ご質問の件、自己解決されたようで良かったです。
最初の間違いは気がつきませんでした(笑)。

[5] Posted by yujiro logo : July 24, 2008 1:42 AM
コメントする
greeting

*必須

*必須(非表示)


ご質問のコメントの回答については、内容あるいは多忙の場合、1週間以上かかる場合があります。また、すべてのご質問にはお答えできない可能性があります。予めご了承ください。

太字イタリックアンダーラインハイパーリンク引用
[サインインしない場合はここにCAPTCHAを表示します]

コメント投稿後にScript Errorや500エラーが表示された場合は、すぐに再送信せず、ブラウザの「戻る」ボタンで一旦エントリーのページに戻り(プレビュー画面で投稿した場合は、投稿内容をマウスコピーしてからエントリーのページに戻り)、ブラウザをリロードして投稿コメントが反映されていることを確認してください。

コメント欄に(X)HTMLタグやMTタグを記述される場合、「<」は「&lt;」、「>」は「&gt;」と入力してください。例えば「<$MTBlogURL$>」は「&lt;$MTBlogURL$&gt;」となります(全て半角文字)