2012-02-08 119 views
2

当我的应用程序用户注册下列验证规则提交前称为:不叫上验证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并搜索论坛,但无法理解为什么我的自定义验证方法未被调用?

+3

你在使用检查模型中的错误? '$模型 - > getErrors()'? 该模型的场景是什么? 你有一个自定义'beforeValidate()'方法吗?如果是这样,你是否真的回来了? 您是否尝试将'CApplication :: end();'放入该验证方法中以查看它是否真的被调用? – Ben 2012-02-09 01:12:24

回答

0

我评论了一些可能的原因,您的代码不工作(它看起来是正确的),但在这种情况下,您可以使用Unique验证程序。

array('email', 'unique')会做到这一点。

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,)); 
    } 

各地新闻司创建的$模型 - >保存()测试的缺失括号,当我加入新行引起了逻辑错误。把括号放在固定的地方。

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