MT4.xプラグイン作成/テンプレートでループを利用する方法 http://www.ark-web.jp/sandbox/wiki/299.html
MT4.xプラグイン作成/テンプレートでループを利用する方法
MTのテンプレート内でループを利用する方法を記述します。
ループを利用する方法として<mt:loop>タグを取り上げます。
配列を使ったループ †
配列を引き渡して各値をループして表示するには以下のようにします。
前提条件 †
ループさせる配列は以下のような配列の参照で定義されているとする。
$eto = ['子', '牛', '寅'];
また、出力するプログラムコードは(たとえばプラグイン内で)上記$etoを利用して
%param = ( eto => $eto ); $html = $app->load_tmpl('eto.tmpl', \%param); print $app->build_page($html, \%param);
となっているとする。$appはMT::App::CMSオブジェクト。
テンプレート名はeto.tmplとする。
テンプレートの記述 †
テンプレート(eto.tmpl)に以下のような記述を行う。
<mt:loop name="eto"> <$mt:var name="__value__"$><br/> </mt:loop>
すると、テンプレートエンジンを通した結果
子<br/> 牛<br/> 寅<br/>
というような出力が生成される。配列の参照を指定したkey名と同じ値を<mt:loop>のnameに指定することで、当該配列が<mt:loop>〜</mt:loop>の中でループします。各ループ単位に配列の値を取り出すには<$mt:var name="__value__"$>を使います。
ハッシュを使ったループ †
ハッシュを引き渡して各key<->valueのペア単位にループして表示するには以下のようにします。
前提条件 †
ループさせるハッシュは以下のようなハッシュの参照で定義されているとする。
$eto = { name => '子', year => 2008, next_name => '牛' };
また、出力するプログラムコードは(たとえばプラグイン内で)上記$etoを利用して
%param = ( eto => $eto ); $html = $app->load_tmpl('eto.tmpl', \%param); print $app->build_page($html, \%param);
となっているとする。$appはMT::App::CMSオブジェクト。
テンプレート名はeto.tmplとする。
テンプレートの記述 †
テンプレート(eto.tmpl)に以下のような記述を行う。
<mt:loop name="eto"> The value of <$mt:var name="__key__"$> is <$mt:var name="__value__"$><br/> </mt:loop>
すると、テンプレートエンジンを通した結果
The value of name is 子<br/> The value of year is 2008<br/> The value of next_name is 牛<br/>
というような出力が生成される。ハッシュの参照を指定したkey名と同じ値を<mt:loop>のnameに指定することで、当該ハッシュが各key<->valueのペア単位に<mt:loop>〜</mt:loop>の中でループします。各ループ単位にkeyの値を取り出すには<$mt:var name="__key__"$>、valueを取り出すには<$mt:var name="__value__"$>を使います。
ハッシュの配列を使ったループ †
ループに引き渡す配列の各要素にハッシュを用いることも可能です。
前提条件 †
ループさせる配列は以下のようなハッシュの配列の参照で定義されているとする。
$eto = [ { name => '子', year => 2008, }, { name => '牛', year => 2009, }, { name => '寅', year => 2010, } ];
また、出力するプログラムコードは(たとえばプラグイン内で)上記$etoを利用して
%param = ( eto => $eto ); $html = $app->load_tmpl('eto.tmpl', \%param); print $app->build_page($html, \%param);
となっているとする。$appはMT::App::CMSオブジェクト。
テンプレート名はeto.tmplとする。
テンプレートの記述 †
テンプレート(eto.tmpl)に以下のような記述を行う。
<mt:loop name="eto"> <$mt:var name="name"$>年は西暦<$mt:var name="year"$>年です。<br/> </mt:loop>
すると、テンプレートエンジンを通した結果
子年は西暦2008年です。<br/> 牛年は西暦2009年です。<br/> 寅年は西暦2010年です。<br/>
というような出力が生成される。ハッシュの配列の参照を指定したkey名と同じ値を<mt:loop>のnameに指定することで、当該配列が<mt:loop>〜</mt:loop>の中でループします。各ループ単位にその要素であるハッシュの値を取得するには<$mt:var name="ハッシュのキー名"$>とします。
同様にして、配列のハッシュも使うことができます。
まとめ †
タグ<mt:loop>には配列、ハッシュ、ハッシュの配列、配列のハッシュを引き渡すことができます。
これはつまり、例えばハッシュの配列のハッシュのハッシュの配列といった複雑なデータ構造も取り扱うことができるということです。
例えば、
$eto = [ { name => '子', year => [2008, 2020, 2032], }, { name => '牛', year => [2009, 2021, 2033], }, { name => '寅', year => [2010, 2022, 2034], } ];
というデータ構造を
<mt:loop name="eto"> <$mt:var name="name"$>年は <mt:loop name="year"> 西暦<$mt:var name="__value__"$>年 </mt:loop> などになります。<br/> </mt:loop>
と2重にループをまわすことで、
子年は西暦2008年 20020年 2032年 などになります。<br/> 牛年は西暦2009年 20021年 2033年 などになります。<br/> 寅年は西暦2010年 20022年 2034年 などになります。<br/>
という出力を得ることができます。__key__や__value__、その他mt:varのnameに指定する値は、一番内側の<mt:loop>が参照しているデータ構造に対して作用します。