データを登録する際にユニークなカラム(ログイン名やメールアドレス等)に
重複するデータが入力された時にチェックする処理を実装する
■実装例
・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にする
