CakePHP

CakePHP エンコードbehaviorの拡張

前回はビヘイビアの使い方を簡単な例で解説させていただきましたが
さらに拡張していく方法を例で解説していこうかと思います。

さらに拡張と言っても簡単な拡張例です(笑
前回のエンコードビヘイビアでは、実は自由度が不足していることに
お気づきでしょうか?ヒントはエンコードです(笑
実はエンコードが固定なのです(汗
CakePHPをデフォルトで利用する場合はいいのかもしれませんが、
実際の現場は違います(泣

「SJIS」やら「EUC-JP」など開発するアプリケーションごとに
利用するエンコードは変わります。
今は「UTF8」が基準になりつつありますが日本では「SJIS」や「EUC-JP」が
いまだに利用されています。特に携帯電話。。。

さて本題ですが、前回紹介させていただいたビヘイビアでは
エンコードが変わるたびに、別のビヘイビアとして複製しなければならない仕様でした。
そこでこのビヘイビアが実行されるたびに、エンコード指定を変更できるようにしましょう。
※先にそれをリリースしてくれというのはご勘弁を(笑

前回のソースコードを次のように変更していきます。
まずはエンコードをセットするメソッドを次のように追加していきます。

function setEncoding($config = array()){
$this->encoding_to = (isset($config['to']) && !empty($config['to']))?$config['to']:'SJIS';
$this->save_encoding_to = (isset($config['save']) && !empty($config['save']))?$config['save']:Configure::read('App.encoding');
}

追加したら次は「setup」を次のように変更します。

function setup(&$model, $config = array()) {
$this->model = $model;
$this->setEncoding($config);
}

これで拡張は完了です。
「setup」の第2引数ではモデルからこのビヘイビアが実行された際に
このビヘイビアに対して値を渡すための変数になります。

つまりモデルで次のように指定することが可能になります。

$actsAs = array('Encoding'=>array('to'=>'EUC-JP','save'=>'utf8'));

の場合は「EUC-JP」へ

$actsAs = array('Encoding'=>array('to'=>'SJIS','save'=>'utf8'));

の場合は「SJIS」
なにも指定しなかった場合は「SJIS」が基本としています。

いかがでしょう?自由度が多少なりとも高くなったと思います(汗
これでこのビヘイビアを複製することなく、1つで複数のエンコード変換に対応できます。

実際のコーディング結果は以下のリンクに例としてダウンロードができます。
エンコードbehavior

ちなみコード中にでてくる

Configure::read('App.encoding')

を不思議に思ったかたもいると思います。
これは「app/config/core.php」に設定されている基本エンコード指定値を呼び出すコードです。

コメント

  1. Rofy より:

    This is a most usuefl contribution to the debate

  2. […] 前回のエンコードビヘイビアを例に記述すると ビヘイビアをつける場合は […]