Movable Type の配列とハッシュの入れ子
Movable Type では配列とハッシュの入れ子が可能です。
以前、MT4.1 でハッシュの入れ子が動作しなかったため、そのまま忘却の彼方でしたが、MT4.261 以降では動作しました。4.261 以前の 4.2x バージョンも動作するかもしれませんが未確認です。
それぞれの組み合わせで動作したサンプルを掲載します。
1.配列の入れ子
<mt:SetVar name="list[0]" value="0" />
<mt:SetVar name="list[1]" value="1" />
<mt:SetVar name="list[2]" value="2" />
<mt:SetVar name="foo[0]" value="$list" />
<mt:GetVar name="foo[0]" setvar="hoge" />
<mt:loop name="hoge">
<mt:GetVar name="__value__" />
</mt:loop>
2.配列とハッシュの入れ子
<mt:SetVar name="list[0]" value="0" />
<mt:SetVar name="list[1]" value="1" />
<mt:SetVar name="list[2]" value="2" />
<mt:SetVar name="foo{bar}" value="$list" />
<mt:GetVar name="foo{bar}" setvar="hoge"/>
<mt:loop name="hoge">
<mt:GetVar name="__value__" />
</mt:loop>
3.ハッシュと配列の入れ子
<$mt:SetVar name="week{mon}" value="Monday"$>
<$mt:SetVar name="week{tue}" value="Tuesday"$>
<$mt:SetVar name="week{wed}" value="Wednesday"$>
<$mt:SetVar name="week{thu}" value="Thursday"$>
<$mt:SetVar name="week{fri}" value="Friday"$>
<$mt:SetVar name="week{sat}" value="Saturday"$>
<$mt:SetVar name="week{sun}" value="Sunday"$>
<mt:SetVar name="list[0]" value="$week" />
<mt:GetVar name="list[0]" setvar="hoge" />
<mt:loop name="hoge">
<mt:GetVar name="__value__" />
</mt:loop>
4.ハッシュの入れ子
<mt:SetHashVar name="week">
<$mt:SetVar name="mon" value="Monday"$>
<mt:SetHashVar name="ampm">
<$mt:SetVar name="am" value="AM"$>
<$mt:SetVar name="pm" value="PM"$>
</mt:SetHashVar>
</mt:SetHashVar>
<mt:GetVar name="week{ampm}" setvar="foo" />
<mt:GetVar name="foo{am}" />
5.ポイント
入れ子の親データを取得する際は、GetVar(Var)タグに setvar モディファイアや SetVarBlock タグを組み合わせて、一旦他の変数に設定します。
<mt:GetVar name="foo[0]" setvar="hoge" />
次のような記述はできません。
<mt:GetVar name="foo[0][0]" />
6.制約
データを取得する際、mt:loop タグの入れ子は対応していないようです。
Movable Type の変数の初期化に関するまとめ
Movable Type の変数の初期化について、「45式::雑記 - MTで変数の値を初期化する方法」に便乗して、まとめっぽくエントリーします。
1.変数を「0」で初期化する
変数を 0 で初期化する場合には value モディファイアの値に 0 を設定します。
<mt:SetVar name="foo" value="0" />
2.変数を空の文字列で初期化する
「45式::雑記 - MTで変数の値を初期化する方法」で解説されている通りです。
主な初期化方法は次の2通りです。ひとつは value モディファイアの値を設定しません。
<mt:SetVar name="foo" value="" />
もうひとつは、value モディファイア自体を記述しません。
<mt:SetVar name="foo" />
単純な変数以外に、設定済みの配列変数やハッシュ変数も上記の方法で初期化できます。
3.変数を未定義にする
変数は MTSetVar タグで1項や2項のお作法で設定されていない限り、未定義の状態です。MTSetVar タグなどで一旦定義した変数を未定義にするには undef 関数を利用します。
<mt:SetVar name="undef(foo)" />
利用するケースは少ないと思いますが、未定義にすることで Perl の defined による判定が行なえます。Movable Type で defined を利用するには、test モディファイアを使用します。
変数の定義・未定義のチェックは、下記のサブテンプレートでお試しください。
a.変数が定義されていない状態でのチェック
<mt:If test="defined $foo">
defined!
<mt:Else>
undef!
</mt:If>
aの実施結果
undef!
b.変数を定義した後のチェック
<mt:SetVar name="foo" value="0" />
<mt:If test="defined $foo">
defined!
<mt:Else>
undef!
</mt:If>
bの実施結果
defined!
c.変数を undef した後のチェック
<mt:SetVar name="undef(foo)" />
<mt:If test="defined $foo">
defined!
<mt:Else>
undef!
</mt:If>
cの実施結果
undef!
undef 関数は、配列変数やハッシュ変数にも利用できます。
4.変数の NULL 設定について
Movable Type のテンプレートタグには、NULL 判定に該当する処理はありません。MT の変数が Perl に依存していると考えれば、Perl に NULL が存在しないのがその理由と思います。
なおネットで調べると、DB の NULL については、変数未定義の状態が該当するようです。
また、PHP には NULL 判定がありますが、is_null() 関数が true を返却する条件として「未定義の変数」も含まれています。
つまり3項の、変数を未定義にする動作が NULL 設定に等しい(または近い)状態と思われます。
