2012年4月18日

Yii Framework: CFormatterを拡張する

CFormatterを拡張して独自のものを作ると便利かもしれないと思い試してみました。作り方の流れは tipshare で紹介されたものがとてもわかりやすいです。

この流れで、具体的にいろいろ CFormatter を拡張したものを作ってみたいと思います。まずは簡単に文字を太くするだけのものを作成。 次に CGridView と CDetailView でも使えるようなので CDetailView で試してみます。適当にデータベーステーブルを作って Gii でモデルと CRUD を作ります (コントローラの accessRules() は今はいらないので削除) 。

続いて CDateFormatter::formatDatetime() を使って、数値型 (int) で保存し create_time カラムを独自の日本語表記で表示してみたいと思います。

1334755524 を 2012年04月18日(水) 22時25分 で表記したいとします。

とりあえず、まず CDateFormatter::formatDatetime() がどんな風に日付を表示するかチェックします。以下は、日本語、英語、中国語でのいつくかの表記パターン。

国によって表記が全く違うのがわかります。あと Yii のバージョンが 1.1.10 時点では日本語表記部分で、日付と時間がくっ付いているバグもいくつかあります (1.1.11 以降では日本語表記のバグは修正される模様です) 。とりあえず、デフォルトでは 2012年04月18日(水) 22時25分 と表記できないようなので、コアの i18n の日本語ファイルを上書きする形で、上記の日付のような表記にしてみたいと思います。

やり方の順序

  1.  framework/i18n/data/ja.php と ja_jp.php を /protected/i18n/data 下にコピペ
  2. en 関係と、その他、国際化するであろう、ファイルもコピペ
  3. /protected/main/config.php に 'localeDataPath' => 'protected/i18n/data/' と書く
これでロケールデータが呼ばれた場合、コアではなく protected 下の i18n のものが呼ばれるようになります。それでは、日本語表記の修正をしていきます。

コメントアウトしてあるものはデフォルトの値です。これで
echo Yii::app()->dateFormatter->formatDatetime($time, 'full', 'short');
と書いている箇所は 2012年04月18日(水) 22時25分 と表示されるはずです。

最後に目的を達成した日付表示を MyFormatter に付け足すと CGridView や CDetailView  でも使えるようになるので、便利です!また CGridView や CDetailView ではなく直接表示したい場合は記述が長くなるので Yii Wiki: Use shortcut functions to reduce typing  を使って短く記述できるようにすればOKかなと思います。

参考リンク

0 件のコメント:

コメントを投稿