Movable Type 4.1 で強化される MT タグの新機能
MTLoop タグの強化
MTLoop
ブロックタグは以前から存在しましたが、MT4.1 からはハッシュのサポートおよび並べ替え機能が追加されています。単にハッシュを持つ変数名を name
モディファイアに設定するだけで、ハッシュの中身を順番に参照しながら値を取得することができます。ハッシュの現在のキーの値は __key__
に、キーに対する値は __value__
にそれぞれ設定されます。なお、配列を指定した場合は、__value__
に値が設定されます (4.0から)。
foreach my $__key__ ( keys %MTVersions ) { print "$__key__ - $__value__\n"; }
と同じ内容のコードを MTテンプレートで書くと以下のようになります。
<MTLoop name="MTVersions"> <MTVar name="__key__"> - <MTVar name="__value__"> </MTLoop>
追加される属性
- sort_by
-
key モディファイアを指定するとハッシュのキーの文字列順で並べ替えます。
value
モディファイアを指定するとハッシュまたは配列の値の順で並べ替えます。key
,value
モディファイアにはreverse
サブモディファイアを設定できます。reverse
サブモディファイアは名前の通り、順序を逆にします。value
モディファイアにはnumeric
サブモディファイアも指定できます。numeric
サブモディファイアは、名前の通り、文字列ではなく数値比較を行います。<MTLoop name="Offices" glue="," sort_by="value numeric reverse"><MTVar name="__value__"></MTLoop>
MTSetHashVar ブロックタグの追加
MT4.1 (Beta 2) より、新たに MTSetHashVar
ブロックタグが追加されました。MTSetHashVar
ブロックタグはハッシュ変数にキーと値の組をまとめて設定するためのブロックタグです。
<mt:sethashvar name="foo">
<mt:setvar name="key1" value="foo">
<mt:setvar name="key2" value="bar">
</mt:sethashvar>
MTIf, MTUnless, MTElse タグの強化
MTIf
, MTUnless
, MTElse
ブロックタグは以前から存在しましたが、このリリースでは以下の機能が追加されています。
ElseIf のような利用法
MTElse
ブロックタグでも MTIf
, MTUnless
ブロックタグと同じように条件式を持つことができるようになり、様々なプログラム言語にある elseif ステートメントと同じような記述が可能になりました。詳しくは以下のブログ記事を参照ください。
追加される属性
- op
-
op モディファイアに関しては、別節を参照ください。
- index
-
配列のインデックス (添え字) を指定して、配列の変数から値を取り出します。
<MTIf name="foo" index="0" eq="hoge">
このタグは、以下のようにも書くことができます。
<MTIf name="foo[0]" eq="hoge">
名前[添え字]
という記述がindex
モディファイアの代わりです。 - key
-
ハッシュのキーを指定して、ハッシュの変数から値を取り出します。
<MTIf name="bar" key="a" eq="hoge">
このタグは、以下のようにも書くことができます。
<MTIf name="bar{a}" eq="hoge">
名前{キー}
という記述がkey
モディファイアの代わりです。 - test
-
Perl の式を記述することができ、結果を利用して条件分岐を行います。
MTSetVar, MTSetVarBlock, MTSetVarTemplate の追加機能
MTSetVar
、MTSetVarBlock
, MTSetVarTemplate
タグを使って配列とハッシュ変数を操作することができます。
追加されるモディファイア
- op
-
op モディファイアに関しては、別節を参照ください。
- index
-
配列のインデックス(添え字)を指定します。
配列変数が存在しない場合は指定された名前の配列変数を新しく作成します。このとき
index
に 0 以外を指定すると、sparse array を作成します。<MTSetVar name="foo" index="0" value="x">
このタグは、以下のようにも書くことができます。
<MTSetVar name="foo[0]" value="x">
名前[添え字]
という記述がindex
モディファイアの代わりです。 - key
-
ハッシュのキーを指定します。
ハッシュ変数が存在しない場合は指定された名前のハッシュ変数を新しく作成して、キーと値のペアを設定します。
<MTSetVar name="bar" key="a" value="x">
このタグは、以下のようにも書くことができます。
<MTSetVar name="bar{a}" value="x">
名前{キー}
という記述がkey
モディファイアの代わりです。 - function
-
配列やハッシュ変数に値を設定するときに実行する関数の名前を指定します。利用できる名前は以下のとおりです。
- push - 配列変数の一番上(または一番最後)に新しい値を追加します。
- unshift - 配列変数の一番下(または一番最初)に新しい値を追加します。
- undef - 配列またはハッシュ変数をクリアします。
- delete -
key
モディファイアで指定されたキーと値のペアをハッシュ変数から削除します。
<MTSetVar name="foo" function="push" value="x">
このタグは、以下のようにも書くことができます。
<MTSetVar name="push(foo)" value="x">
関数名(名前)
という記述がfunction
モディファイアの代わりです。
MTGetVar, MTVar ファンクションタグの追加機能
MTGetVar
, MTVar
を使って配列とハッシュ変数から値を取得することができます。
追加されるモディファイア
- op
-
op モディファイアに関しては、別節を参照ください。
- index
-
配列のインデックス(添え字)を指定します。
配列変数が存在しない場合や指定されたインデックスの値が存在しないときは空の文字列を返します。
<MTGetVar name="foo" index="0">
このタグは、以下のようにも書くことができます。
<MTSetVar name="foo[0]">
名前[添え字]
という記述がindex
モディファイアの代わりです。 - key
-
ハッシュのキーを指定します。
ハッシュ変数が存在しない場合や指定されたキーがが存在しないときは空の文字列を返します。
<MTGetVar name="bar" key="a">
このタグは、以下のようにも書くことができます。
<MTGetVar name="bar{a}">
名前{キー}
という記述がkey
モディファイアの代わりです。 - function
-
配列やハッシュ変数に値を設定するときに実行する関数の名前を指定します。利用できる名前は以下のとおりです。
- pop - 配列変数の一番上(または一番最後) から値を返します。
- shift - 配列変数の一番下(または一番最初) から値を返します。
- count - 配列変数に含まれる値の数、またはハッシュ変数に含まれるキーの数を返します。
<MTGetVar name="foo" function="push">
このタグは、以下のようにも書くことができます。
<MTGetVar name="push(foo)">
関数名(名前)
という記述がfunction
モディファイアの代わりです。
op モディファイア
op
モディファイアは MTSetVar
、MTSetVarBlock
, MTGetVar
、MTVar
, MTIf
, MTUnless
, MTElse
, MTElseIf
で利用可能です。 (MTSetVarTemplateでは、opモディファイアの利用はできません)
設定値には、単純な計算を行う関数の名前を指定します。
演算関数
add
または+
: 加算sub
または-
: 減算mul
または*
: 乗算div
または/
: 除算mod
または%
: 剰余inc
または++
: インクリメントdec
または--
: デクリメント
value モディファイアの動作の変更
MT4.0 までは、MTVar
ファンクションタグに value
モディファイアを設定すると、それは MTSetVar
ブロックタグと同じ動作をしていました。たとえば、以下の2つのテンプレートタグは同じ働きをします。
<MTVar name="bar" value="quux">
<MTSetVar name="bar" value="quux">
op
モディファイア属性の導入で、この動作は変更されました。MTVar
ブロックタグに value
モディファイアが設定されていても、op
モディファイアが合わせて設定されていた場合には、MTSetVar
ファンクションタグと同じ動作にはならず、MTGetVa
r ブロックタグと同じ動作になります。たとえば、以下の2つのテンプレータグは同じ働きをします。どちらも、value
モディファイアの値は foo 変数には格納されません。
<MTVar name="foo" value="1" op="+">
<MTGetVar name="foo" value="1" op="+">
name
モディファイアで指定された変数がまだない場合、MTSetVar
ファンクションタグに op
モディファイアを指定しても何もせず、ただ値が設定されます。すでに変数が存在する場合に op
モディファイアを指定すると、MTSetVar
ファンクションタグは単純に value
モディファイアの値を格納するのではなく、既存の値と value
モディファイアで指定された値とを op
モディファイアで計算した結果を格納します