最近触らなくなったsmartyの話

一時期脚光を浴びたsmarty...


今ではテンプレートエンジン自体が重い、デザイナー想いでないなど、時代の変化とともに、一選択肢でしかなくなりました。現在はsmarty3まで出ているんですね。


ガラケー+smartyという懐かしい環境構築が必要になり、今時UTF-8でもいいんじゃね?みたいな想いもありつつ、SJISで出力したくなった次第


で、ネットで検索すると全盛期の情報が多いせいか、smarty3では使えなくなった情報が上位に来てしまう、まぁ仕方ない。

(PHP)Smartyを使っているがShift-JISで出力したい : old_3流プログラマのメモ書き

ここらを参考にしつつ、クラスのメソッド指定したいなって思うわけです。いつまでもグローバルな関数を作らされては、smartyも使ってられないわけですよ。まぁ用意されてるんで、問題ないれす(^q^)

	//ガラケーの場合、コンバート
	if($this->device == 'mb') {
		$this->smarty->registerFilter(
			'output', 
			array(
				$this,
				'register_outputfilter'
			)
		);
	}

スマーティも一テンプレートエンジンなので、テンプレートクラスでラッピングされている状況です。その中身です。だからphptal使うフレームワークなら「$this->phptal」みたくなる。で、registerFilterでガラケーで、さらに出力時だけUTF-8からSJISに変えます。
そこでコンバートのメソッドが、テンプレートクラス内に記述があるわけです。

そいつを叩いてほしいので、関数名の文字列を第二引数に渡すわけではなく、配列で、一つ目にオブジェクトを渡してメソッド名を二つ目にいれます。こうすると、オブジェクトメソッドも無事処理してくれます。


Smartyは、まだ頑張ります!!知らないけど。


おまけ:

	/**
	 * register_outputfilter アウトプットフィルタ
	 * テンプレートが実行される時の処理
	 * @param str $template_source テンプレート
	 * @return コンバートまたは、そのままのテンプレート
	 */
	public function register_outputfilter($template_source) {
		if (function_exists('mb_convert_encoding')) {
			//文字コードを変換する
			return mb_convert_encoding($template_source, 'SJIS', 'UTF-8');
		}

		return $template_source;
	}