それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

Smarty(旧版)で日本語配列キーを使う理想的な解決方法

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は便利です。

Smartyへの愚痴。

Smartyを利用してるコードを見てると、日本語キーをわざわざアルファベットに変換するスクリプトを書いているのも無駄だと思うし
日本語キーとアルファベットの対応表をコメントに書いてるのも面倒だし。

かといって日本語キーを外すと英語分からない人から苦情きたり。また、取引業者さんの規程でSmartyとか意味不明な制約化されたりとSmartyに悩まされることが多いんですね。

Smartyの文法はPHPっぽいくせに、まったくPHPと互換性がない別言語になってるのに、PHP言語に最適じゃないのです。

Smartyは戦犯。

Smartyを世に広めた人々はA級戦犯だと思います。

Smartyは戦犯だと思います。メンテが続く限り触らなくちゃいけないので、

一冊”中古”で用意したらいいと思います。新品買うなんてトンデモナイ。



2011年になってもSmartyを紹介するのが出版されてるし・・・


php ならSlimのテンプレートとか最高ですよ。