テンプレート内で現在の日時

2007/02/05 | Smarty

Smartyテンプレート内での現在の日時の取得は{$smarty.now}でOK。
{$smarty.now|date_format:”%Y/%m/%d %H:%I:%S”}なんて感じでフォーマットして出力して使えばよさそう。これも時々忘れてしまうのでメモ。

シフトJISで記述されたテンプレートファイルを使うために

2007/02/02 | Smarty

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が生成したキャッシュファイルを削除しておくことを忘れてはいけない。キャッシュが生成された状態では、いくらフィルタを設定しても、新しくコンパイルしなおしてくれないからだ。
これでデザイナにも簡単に作業してもらえる。

日付と時刻をフォーマットする

2007/02/01 | 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関数と同じであって欲しかった。

修正子でPHP関数

2007/01/23 | Smarty

Smartyの修正子は、標準装備の修正子のほかに、カスタムで作成した修正子も使用できるし、PHPの関数も修正子として利用できる(普段、普通に使用していた)。
しかし修正子としてstr_replaceを使うと、なぜかうまく動いてくれなくて、理由がわからない(例によってSmartyのソースを読むのが嫌だから)。いろいろ調べて、Smarty標準装備のreplaceという修正子で対応できることがわかった(当然こちらを使うのが正統派)。

ではなぜstr_replaceはダメなのか。

ウェブを調べていたら「暗黙的な修正子としてPHP関数を・・・」という記述があった。どうやらPHP関数によってはうまく動作しないものがあるようだ(だから標準の修正子を使えって話なのだろう)。

Read the rest of this entry »

テンプレート内で関数処理する

2006/12/05 | Smarty

smartyのテンプレート内で関数を使う必要が生じた。単に「関数で処理して表示」というわけではなく、いったんプログラムで処理して処理した戻り値をsmarty変数に返す、という処理をしたい。
いろいろ調べた結果、関数群を記述したクラスからオブジェクトを生成し、smartyオブジェクトに登録する、という方法が有効だとわかった。
具体的には、

class myClass
{
 function myfunc($params,&$objSmarty){
  return (戻り値);
 }
}

とクラスを定義しておき、これを以下の手順で登録する。

$myObj=new myClass;
$objSmarty->register_object(‘myObj’,$myObj);

テンプレート内で上記関数を呼び出して戻り値を変数に格納するには以下のように記述する。

{myObj->myfunc assign=returnValue}

何がやりたかったかというと、smartyに対して文字列で与えられた変数を分割して、生成した配列を個別に扱いたかった、ということ。
きっと、もっとスマートな方法があると思うのだが思いつかなかった。まぁ、これでもできているので、とりあえず解決。

Read the rest of this entry »


守谷市(まちの情報ポータル) 無料アンケートレンタルjpForm.net