今まではCakePHP1.2を長い間使っていたけど、バーチャルフィールドに惹かれてCakePHP1.3を使うことにした。
CakePHP1.3ではapp/libsというディレクトリが増えていて、知人が言うには「何でもいれると良いよ!(MASA-Pさん)」とのことなので、何でもいいからいれてみることにした。
何を入れるかというと、まずはマスタ系の文字列を格納しておきたい。
というのも、1年ほど前、データベースでi18n対応したとき、あまりの面倒くささと手際の悪さで、__()関数使ったほうがメンテナンシビリティ高いアルよ!と独断している状態を続けている。
というわけなんだけど、さすがにすべてのリテラル文字列を配列に入れて宣言するのは、いくらなんでもメモリ使いすぎなので、カテゴリ別に関数にしておくことにした。
やったことはこう。
- app/libs内にmasters.phpなど作成
- masters内ではMastersクラスを作成するが、Objectを継承しておく(別にControllerでも良い)
- Mastersクラス内には単純なメソッドしかおかない。具体的には、血液型マスタであれば、return array(1=>__('A型', true),~~~)で血液型をまるごと返却するメソッド
- AppController側からスタティックに呼び出してみる
繰り返しになるけど、なぜ性別、血液型、国名などを別個の関数にしているかというと、常に全部を引き回したくないからだ。
必要なときだけ、必要な分を取得するような形にしておきたかった。
しかもpublic static function bloodtypes()などとして宣言しているので、呼び出す最には
Masters::bloodtypes();で配列が返ってくる。
$Masters = new Masters(); $Masters->genders();とかしないで良い。
脳内すっきり。
具体的なコードは以下。
class Masters extends Object { public static function genders() { return array( 1 => __('男性', true), 2 => __('女性', true), ); } public static function bloodtypes() { return array( 1 => __('A型', true), 2 => __('B型', true), 3 => __('O型', true), 4 => __('AB型', true), 5 => __('不明', true), ); } ・ ・ ・ ・
これなら完全に単語が国際化の対象にできる。
この方法を使って、validation.phpなども作り、モデルのバリデーションメッセージも完全に国際化対応できるかもしれない。
そうそう、引数が0のキーはあえて指定しないでおく。
というのも、ヘルパー使ってselectタグを吐くときなど、emptyオプションで個別に指定したいということと、0とかnullとか""とか、PHPは微妙にキモいので、あえて触らない主義だからだ。
で、実際に、例えば性別を表示してみるとすると、このようになる。
App::import('Lib', 'Masters'); pr(Masters::gender());これで画面には
Array ( [1] => 男性 [2] => 女性 )と表示されることになる。
めでたしめでたし。
facebook
twitter
google+
fb share