どうも!tetsuです。
前回に引き続き、CakePHP2系のモデル「AppModel」を有効に活用する事例(第二弾)を紹介します。
■ON/OFFフラグの共通化
データベースに保存された1レコードに
「ON/OFF」のようなフラグが存在するとします。
これをAppModelで共通処理を用意することで、
コーディングが楽になり、ルールを統一することができます。
よくある例として「表示/非表示」のフラグフィールド「display」を例に、
実装例を以下に記載します。
1.「表示/非表示キー」の定義
AppModel.php
class AppModel extends Model {
//表示・非表示キーキーの定義
public $display_name='display';
}
2.フラグ処理の実装
AppModel.php
class AppModel extends Model {
//フラグ処理
function display($id){
if($this->_isDisplayField()){
if(empty($id)){$id=$this->id;}
$conditions=array();
$conditions['conditions']['AND'][$this->alias.'.'.$this->primaryKey] = $id;
$conditions['fields']=array($this->primaryKey,$this->display_name);
$conditions['recursive']=-1;
$data = $this->find('first',$conditions);
if(!empty($data)){
$data[$this->alias][$this->display_name]=($data[$this->alias][$this->display_name]=='1')?0:1;
return $this->save($data);
}else{
return false;
}
}else{
return false;
}
}
//「フラグキー」の有無確認
function _isDisplayField(){return isset($this->_schema[$this->display_name]);}
}
上記を実装し、コントローラーから「display()」メソッドを実行することで、
対称レコードの「display」フィールドを「0」と「1」で判定し、
反転保存することができます。
■Validation前に日本語自動変換処理
続いて、日本語特有な処理を公開します。
不特定多数のユーザーがフォームの入力を行うと、
半角数字で入力する方や全角カナで入力する方など、
様々な入力をする方がいます。
これを毎回入力チェックをして、エラーを出すのは若干優しくは無いケースもあります。
そこで、「AppModel」に共通処理を用意し、各モデルで定義することで、
Validation前に自動変換してしまおうという場合に利用する例です。
1.各モデルで利用する為の「設定」用の定義
AppModel.php
class AppModel extends Model {
//設定用定義
public $mbConvertKana=array();
}
2.設定が存在した場合の日本語変換処理の実装
AppModel.php
class AppModel extends Model {
public function beforeValidate($options = array()) {
//Auto mb convert kana
if(!empty($this->mbConvertKana)){
while(list($key,$val)=each($this->mbConvertKana)){
$results = Hash::extract($this->data,$key);
if(!empty($results)){
if(is_array($results)){$results=current($results);}
$results = mb_convert_kana($results,$val);
$this->data=Hash::insert($this->data, $key, $results);
}
}
}
parent::beforeValidate($options);
return true;
}
}
上記を実装後、利用したいモデルで以下のような設定を記述します。
ここでは「User」モデルを例に記載します。
User.php
class User extends AppModel {
public $mbConvertKana=array(
'User.name'=>'KVa'
);
}
設定は至って簡単に配列で指定します。
キーに「フィールド名」、値にPHPの関数「mb_convert_kana()」のオプション値を
指定することで、Userモデルで「beforeValidate()」が実行された場合、
Validation前に「mb_convert_kana()」が実行されるようになります。
入力値を統一させたり、無駄なValidationエラーを表示させたく無い場合に活用できます。
最後に
今回も2点の例を紹介しました。
前回同様、参考程度にご利用下さい。
LIGはWebサイト制作を支援しています。ご興味のある方は事業ぺージをぜひご覧ください。