movabletype.jp
検索
[ Movable Type 4 ドキュメント ]

Movable Type 4.1 で強化される MT タグの新機能 MT4.1

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>

MTFor ブロックタグの追加

MT4.1 では、新たに MTFor ブロックタグが追加されました。詳細はテンプレートタグ・リファレンスを参照ください。

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 の追加機能

MTSetVarMTSetVarBlock, 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 モディファイアは MTSetVarMTSetVarBlock, MTGetVarMTVar, 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 ファンクションタグと同じ動作にはならず、MTGetVar ブロックタグと同じ動作になります。たとえば、以下の2つのテンプレータグは同じ働きをします。どちらも、value モディファイアの値は foo 変数には格納されません。

<MTVar name="foo" value="1" op="+">
<MTGetVar name="foo" value="1" op="+">

name モディファイアで指定された変数がまだない場合、MTSetVar ファンクションタグに op モディファイアを指定しても何もせず、ただ値が設定されます。すでに変数が存在する場合に op モディファイアを指定すると、MTSetVar ファンクションタグは単純に value モディファイアの値を格納するのではなく、既存の値と value モディファイアで指定された値とを op モディファイアで計算した結果を格納します