文字列を連結して変数に(その2)
さっそく次のパターンが出てきた。数値の四則計算をしてその結果を変数に格納する。
変数と変数の計算
{assign var=sum value=`$price*$num`}
*の前後に空白が入るとだめなんだよね。あと変数が普通の数値になってもだめ。このあたりは一回どこかでまとめないといけない(毎回悩むから)。
さっそく次のパターンが出てきた。数値の四則計算をしてその結果を変数に格納する。
変数と変数の計算
{assign var=sum value=`$price*$num`}
*の前後に空白が入るとだめなんだよね。あと変数が普通の数値になってもだめ。このあたりは一回どこかでまとめないといけない(毎回悩むから)。
普段Smartyを使うことが多いが、テンプレート内で文字列の演算をして、その結果を変数に格納したい、ということがよくある。
ある意味、テンプレート内にプログラミングのルーチンを入れるわけだからデザインとプログラムの分離という面から考えればよろしくないのだが、便利に使える機能だ。でも各種演算をして変数に格納する記述、いつも忘れてしまうので、ここにメモ。
文字列「title_」と変数$myTitleをくっつけて、smarty変数$hensuに格納。
{assign var=hensu value=”title_$myTitle”}
他のパターンは、またそういう記述が出てきたときにでも・・・。
Smartyテンプレート内での現在の日時の取得は{$smarty.now}でOK。
{$smarty.now|date_format:”%Y/%m/%d %H:%I:%S”}なんて感じでフォーマットして出力して使えばよさそう。これも時々忘れてしまうのでメモ。
Smartyではテンプレートファイルとして、EUC-JPまたはUTF-8で記述されたテンプレートを使用することになっている。Shift_JISで記述されたテンプレートファイルは文字化けする。これはおそらく、元来PHPがShift_JISをサポートしていないためだろう。もちろんPHPでも変数内にShift_JISの文字列を格納することはできる。Smartyの場合はテンプレートファイルからPHPの実行形式のファイルを生成する(テンプレートファイルをコンパイルして使うので)。これはつまり、テンプレートファイルに書かれたことがそのままPHPで実行して表示される、と考えるべきだろう。つまりテンプレートファイルをShift_JISで記述するということは、PHPプログラムをShift_JISで記述することと同義なのだ。これでは文字化けして当然だ。
で、どうするか。
Smartyのプレフィルタという機能を使う。これによりテンプレートファイル読み込み時にいったんファイルを内部文字エンコードに変換してしまうのだ。では、どうするか。
まずSmartyのプラグインディレクトリに、以下のような関数ファイルを設置しておく(ファイル名prefilter.sjis2euc.php)。
<?php
function smarty_prefilter_sjis2euc($buff,&$smarty)
{
return mb_convert_encoding($buff,’EUC-JP’,’SJIS’);
}
?>
これを以下のように呼び出す。
$smarty->load_filter(‘pre’,’sjis2euc’);
これでShift_JISで書かれたテンプレートを使うことができるようになる。ちなみにテストをするときは、その都度Smartyが生成したキャッシュファイルを削除しておくことを忘れてはいけない。キャッシュが生成された状態では、いくらフィルタを設定しても、新しくコンパイルしなおしてくれないからだ。
これでデザイナにも簡単に作業してもらえる。
Smartyでは出力時に日付や日時を好みのフォーマットに変更できるが、フォーマット文字列の使い方が標準のdate関数などとは違うみたい。だからいつも間違えてしまう。
%a・・・現在のロケールに基づいた曜日名(省略形)。
%A・・・現在のロケールに基づいた曜日名(完全形)。
%b・・・現在のロケールに基づいた月名(省略形)。
%B・・・現在のロケールに基づいた月名(完全形)。
%c・・・現在のロケールに基づいた日時。
%C・・・世紀。00-99。
%d・・・日。01-31。
%D・・・%m/%d/%yと同じ。
%e・・・日。1-31。一桁のときは先頭に空白がはいる。
%h・・・%bと同じ
%H・・・時。00-23。
%I・・・時。01-12。
%j・・・1月1日からの日数。001-366。
%m・・・月。01-12。
%M・・・分。00-59。
%n・・・改行。
%p・・・現在のロケールに基づいたAM・PM表記。
%r・・・時間。12時間表記。
%R・・・時間。24時間表記。
%S・・・秒。00-59。
%t・・・タブ。
%T・・・%H:%M:%Sと同じ。
%u・・・曜日。1(月)-7(日)。
%U・・・1年の何番目の週か。
%V・・・1年の何番目の週か。
%w・・・曜日。0(日)-6(土)
%W・・・1年の何番目の週か。
%x・・・現在のロケールに基づいた日付。
%X・・・現在のロケールに基づいた時刻。
%y・・・年。00-99。
%Y・・・年(4桁)。
%Z・・・タイムゾーン
%%・・・%
ほとんど使わないけど、年月日時分秒だけ覚えとけば問題ない。これくらいはdate関数と同じであって欲しかった。