当用户注册我的应用程序时,在提交之前会调用以下验证规则:
public function rules()
{
return array(
array('email, firstName, lastName, password, passwordConfirm, telephone', 'required'),
array('club, email, firstName, lastName, level, password, telephone', 'length', 'max'=>45),
array('passwordConfirm', 'compare', 'compareAttribute'=>'password', 'on'=>'register'),
array('email', 'isUniqueEmailAddress'),
);
}
前三个验证规则成功完成,但第四个(自定义验证方法)不成功。它应该调用函数'isUniqueEmailAddress'并执行以下操作:
/*
* Returns true if there doesn't exist a user in the database with the submitted email
*/
public function isUniqueEmailAddress($attribute, $params)
{
//if (User::model()->find('email=:email', array(':email'=>$this->email)) !== null)
//{
$this->addError('email', 'Email account already exists');
//}
}
正如您所看到的,我甚至已经注释掉了所有逻辑,只需确保将验证错误发送回注册表单,但验证()不会返回任何错误。我已阅读Yii's Documentation并浏览论坛,但无法理解为什么我的自定义验证方法没有被调用?
答案 0 :(得分:1)
我在调用$ model-> save()后尝试在控制器中设置flash消息时遇到此问题。这是一个导致逻辑错误的代码格式化问题。
例如,在模型中,我有类似的东西:
public function validateNumItems($attribute, $params) {
$this->addError($attribute, 'Validate Items Failed');
}
理论上,这应该导致表单提交每次都失败以进行调试。但它从来没有。
我的控制器的更新操作如下所示:
public function actionUpdate($id) {
$model = $this->loadModel($id);
// Uncomment the following line if AJAX validation is needed
// $this->performAjaxValidation($model);
if (isset($_POST['Collection']))
{
$model->attributes = $_POST['Collection'];
if ($model->save())
Yii::app()->user->setFlash('success', "Data saved!");
$this->redirect(array('index'));
}
$this->render('update', array('model' => $model, ));
}
Gii创建的$ model-> save()测试周围缺少的括号在我添加新行时导致了逻辑错误。将括号放在固定的位置。
public function actionUpdate($id) {
$model = $this->loadModel($id);
// Uncomment the following line if AJAX validation is needed
// $this->performAjaxValidation($model);
if (isset($_POST['Collection'])) {
$model->attributes = $_POST['Collection'];
if ($model->save()) {
Yii::app()->user->setFlash('success', "Data saved!");
$this->redirect(array('index'));
}
}
$this->render('update', array('model' => $model, ));
}
答案 1 :(得分:1)
array('email', 'exist')
像这样。
public function rules()
{
return array(
array('email, firstName, lastName, password, passwordConfirm, telephone', 'required'),
array('club, email, firstName, lastName, level, password, telephone', 'length', 'max'=>45),
array('passwordConfirm', 'compare', 'compareAttribute'=>'password', 'on'=>'register'),
array('email', 'exist')
);
}
答案 2 :(得分:0)
我评论了一些可能的原因,您的代码无效(看起来正确),但在这种情况下,您只需使用Unique
验证程序。
array('email', 'unique')
会这样做。
答案 3 :(得分:0)
试试这个,它运作正常 -
public function rules()
{
return array(
array('email, firstName, lastName, password, passwordConfirm, telephone', 'required'),
array('email', 'email','message'=>"The email isn't correct"),
array('email', 'uniqueEmail'),
);
}
你的自定义功能,写入相同的模型 -
public function uniqueEmail($attribute, $params)
{
if($user = User::model()->exists('email=:email',array(':email'=>$this->email)))
$this->addError($attribute, 'Email already exists!');
}