Smartyで配列キー日本語を入れていると動作できませんでした。日本語キーを使えたらいいなと思い、解決策を探りました。
Smartyで日本語が扱えない
PHP側
<?php $param = array(); $param["名前"] ="takuya"; $param["メアド"] = "takuyaXXX@gmail.com" $smarty->assgin("user", $param);
Smary側で、これが出来ない
こんにちは {$user.名前} さん
Smartyテンプレートが解釈できずにアウトになる。Smarty旧版は日本語配列のキーを使えなくて苦労することになります。
Smartyで日本語キーを使うための解決策
array を ArrayObjectで置き換え
ArrayObjectの採用で日本語キーの配列もそのまま使えるようになります。
いろいろ考えたけれど、一番理想的な解決案。これで互換性も保てるし、コードの影響範囲が少ないし依存関係無い。
Smartyで日本語キーが入った配列を使う。
実際に使ってみたらこんなかんじになります。
変更前
<?php $list = array("名前"=>"takuya"); $smarty->assign($list);
変更後
<?php $list = array("名前"=>"takuya"); $list = new ArrayObject($list); $smarty->assign($list);
Smartyに変数をアサインするassgin()関数の直前に new ArrayObject($array)を挟み込みます。
Smartyテンプレート側でこれができなかった
こんにちは{$list.名前} さん
上の例はエラーになるが、以下は出来る。
日本語キーも扱える。
こんにちは{$list->offsetGet("名前")}さん
ArrayObjectは配列として扱えるSPLクラスなので、通常の配列部分に全く影響なく使うことが出来る。
これで日本語キーを気にせずSmartyを使うことができます。
結論
array は ArrayObjectで置き換えると吉。
offsetGet("キー")とか面倒なんだけど?
そうですね。ぼくも面倒だと思いました。ArrayObjectをExtendsしたらどうでしょうか?
<?php class ArrayObj extends ArrayObject{ public function get($key){ return $this->offsetGet($key);} public function _($key){ return $this->offsetGet($key);} }
で拡張して、
こんにちは{$list->offsetGet("名前")}さん こんにちは{$list->_("名前")}さん
のように使うことにしました。
まとめ
ArrayObjectは便利です。