データを登録する際にユニークなカラム(ログイン名やメールアドレス等)に
重複するデータが入力された時にチェックする処理を実装する
■実装例
・Userモデルのrules()メソッドを修正 ・重複チェックするcheckUnique()メソッドを実装 ・performAjaxValidation()でAjaxによるチェックを実行するようにする
Userモデルのrules()メソッドを修正
【/protected/models/User.php】ファイルのrules()に追加
public function rules() { return array( //・・・処理 // 重複チェックを定義 array('login_name', 'checkUnique'), array('mail', 'checkUnique'), //・・・処理 ); }
重複チェックするcheckUnique()メソッドを実装
【/protected/models/User.php】ファイルのcheckUnique()に追加
private static $_items = array(); /** * データリスト取得 **/ public static function getItems($select = 'name') { self::loadItems($select); return self::$_items; } /** * 指定データ取得 **/ public static function getItem($id, $select = 'name') { self::loadItems($select); return isset(self::$_items[$id]) ? self::$_items[$id]:false; } /** * データ読み込み **/ private static function loadItems($select = 'name') { // データ取得 $models = self::model()->findAll( array('select'=>'id,'.$select) ); foreach($models as $model) { self::$_items[$model->id] = $model->$select; } } /** * 重複チェック **/ public function checkUnique($attribute) { // 重複チェックのパラメータを設定 if($this->isNewRecord) { // 新規 $conditions = array( 'select'=>'id', 'condition'=>$attribute.'=:'.$attribute, 'params'=>array(':'.$attribute=>$this->{$attribute}), ); } else { // 更新 $conditions = array( 'select'=>'id', 'condition'=>$attribute.'!=:'.$attribute.'1 AND '.$attribute.'=:'.$attribute.'2', 'params'=>array(':'.$attribute.'1'=>self::getItem($this->id, $attribute), ':'.$attribute.'2'=>$this->{$attribute}), ); } $models = self::find($conditions); if(is_null($models) === false) { $this->addError($attribute, '既に登録されています'); } }
更新時は元のデータを重複対象から外す処理をいれないと重複判定されるため 重複対象から外す処理を書く必要がある getItem()メソッドは指定したカラムのデータを取得する
performAjaxValidation()でAjaxによるチェックを実行するようにする
【/protected/controllers/userController.php】ファイルと【/protected/views/user/_form.php】で
Ajaxによるバリデーションを”actionCreate()”メソッドと”actionUpdate()”メソッドに実行するように設定
■userController.phpファイルを修正
public function actionCreate() { $model = new User; // 下記を追記 $this->performAjaxValidation(array($model)); if(isset($_POST['User'], $_POST['UserDetail'])) //・・・処理 } public function actionUpdate($id) { $model = User::model()->findByPk($id); // 下記を追記 $this->performAjaxValidation($model); //・・・処理 }
■_form.phpファイルを修正
<?php $form=$this->beginWidget('CActiveForm', array( 'id'=>'user-form', 'enableAjaxValidation'=>true, )); ?>
『enableAjaxValidation』パラメータをtrueにする