Webサービス開発、あるよ
Webサービス開発、あるよ
2013.07.09

CakePHPの「AppModel」を有効に活用して開発を効率化する方法 第二弾

tetsu

どうも!
ケンタの食べ放題で胃がやられた段田が心配な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点の例を紹介しました。
前回同様、参考程度にご利用下さい。

U Y A
K A