没有在validate()上调用Yii自定义验证规则

时间:2012-02-08 23:57:48

标签: php forms validation yii

当用户注册我的应用程序时,在提交之前会调用以下验证规则:

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并浏览论坛,但无法理解为什么我的自定义验证方法没有被调用?

4 个答案:

答案 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!');
    }