Template::Toolkitのソート
CMSのテンプレートエンジンとして使えないかとTemplate::Toolkitをいろいろ弄っています。
Template::Toolkitには豊富なフィルタ、VirtualMethodが用意されています。
そのVirtualMethodのひとつにsortがあります。
配列の場合
[% array = [ 'japan', 'brazil', 'austrailia', 'croatia'] %] [% array.sort.join %] Output austrailia brazil croatia japan
となります。
要素がハッシュの場合は、キーを与えることでソートできます。
[% hash_array = [ { ja => '日本', en => 'japan'}, { ja => 'ブラジル', en => 'brazil'}, { ja => 'オーストラリア', en => 'austrailia'}, { ja => 'クロアチア', en => 'croatia'}, ] %] [% FOREACH entry = hash_array.sort('en') -%] ・[% entry.ja %] [% END %] Output ・オーストラリア ・ブラジル ・クロアチア ・日本
これだけでも十分な機能なのですが、次のようにもうひとつ下?のハッシュ値でソートができないものでしょうか?
[% hash_array = [ { name => { ja => '日本', en => 'japan'} }, { name => { ja => 'ブラジル', en => 'brazil'} }, { name => { ja => 'オーストラリア', en => 'austrailia'} }, { name => { ja => 'クロアチア', en => 'croatia'} }, ] %] [% FOREACH entry = hash_array.sort('name.en') -%] ・[% entry.name.ja %] [% END %] Output ・日本 ・ブラジル ・オーストラリア ・クロアチア
これは、結果的にソートされません。
Stash.pmのsortの実装を見ると 'name.en' といった指定はできないことがわかります。
.(ドット)でsplitして、分解したキーでハッシュアクセスできると、期待のソートができるハズなのですが、動的に変える方法が分かりません。
Stash.pm line:285 ? $_->{ $field } :
$_->{ name }->{ en }のようになると期待の結果が得られるのですが、動的にやる方法が分かりません。
splitした数に応じて分けるのはあまりにイケテないし。。
こういったのは、あまり需要がないものなんでしょうかね。