Yii:规则验证中的唯一电子邮件地址无效

Yii:规则验证中的唯一电子邮件地址无效,yii,Yii,我构建了一个表单,显示用户的现有电子邮件,然后要求用户发送一封新电子邮件和一封确认电子邮件,以确保他们键入的邮件正确无误。新电子邮件的字段为“新电子邮件”,确认字段为“新电子邮件确认”。该模型已具有“email”字段,其中存储了其现有电子邮件地址。使用的场景是“更改电子邮件”。其他每一条规则都有效,并在我的模型中验证错误,但这一条…当我输入完全相同的电子邮件/确认“电子邮件”中已接收的邮件时,我没有收到错误,允许保存 在规则中,我添加了以下内容: array( 'new_email,

我构建了一个表单,显示用户的现有电子邮件,然后要求用户发送一封新电子邮件和一封确认电子邮件,以确保他们键入的邮件正确无误。新电子邮件的字段为“新电子邮件”,确认字段为“新电子邮件确认”。该模型已具有“email”字段,其中存储了其现有电子邮件地址。使用的场景是“更改电子邮件”。其他每一条规则都有效,并在我的模型中验证错误,但这一条…当我输入完全相同的电子邮件/确认“电子邮件”中已接收的邮件时,我没有收到错误,允许保存

在规则中,我添加了以下内容:

  array(
    'new_email,new_email_confirm',
    'required',
    'message'=>'This is a required field',
    'on'=>'change_email',
  ),
  array(
    'new_email',
    'email',
    'message'=>'Invalid email address',
    'on'=>'change_email',
  ),
  array(
    'new_email',
    'compare',
    'compareAttribute'=>'new_email_confirm',
    'message'=>"Emails don't match",
    'on'=>'change_email',
  ),
  array(
    'new_email',
    'unique',
    'className'=>'User',
    'attributeName'=>'email',
    'on'=>'change_email',
  ), 

我做错了什么?

我有两个肮脏的建议来做这件事,因为我无法找出确切的问题是什么

1-编写唯一性自定义验证并删除唯一性规则:

并写如下:

public function customValidationRule(){
    //after all validation rules
    if(!$this->hasErrors()){
        $check=User::model()->findByAttributes(array('email'=>$this->new_email)); //or $this->new_email_confirm
        if(!is_null($check) || !empty($check)){
            $this->addError('new_email','The new email has been already taken by other!');
        }
    }
} 

2-在您的唯一规则中,将新电子邮件替换为新电子邮件确认。

所有规则都已添加@samuel liew,感谢您的查看。问题,测试用例是什么?它在任何时候都有多个错误,还是一次有一个错误?如果前一个测试每个测试都有多个错误,那么如果已经发生另一个错误,则将跳过唯一规则。只需添加到@SamuelLiew comment。您不需要ClassName,但如果您根据“电子邮件”字段测试唯一性,则需要attributeName。@ews2001是新电子邮件的类型,新电子邮件的类型是否相同?@NikolasGrottendieck-如果存在错误,则会显示在错误摘要中。如果我在表单中将新电子邮件设置为“asdf”,我会看到3个错误,这是必填字段“新电子邮件确认”、“无效电子邮件地址”“新电子邮件”和“电子邮件不匹配”。一旦所有这3个错误都被修复,表单将提交,即使我使用数据库中的现有电子邮件,我也无法显示我的唯一性。如果这不是一个理想的答案,我很抱歉。我发布这个答案只是作为一个替代解决方案:我尝试了你的自定义验证规则,它成功了!我只是希望我能用上面显示的Yii‘独特’验证器来运行它,但不管怎样,您的解决方案都对我有效。
public function customValidationRule(){
    //after all validation rules
    if(!$this->hasErrors()){
        $check=User::model()->findByAttributes(array('email'=>$this->new_email)); //or $this->new_email_confirm
        if(!is_null($check) || !empty($check)){
            $this->addError('new_email','The new email has been already taken by other!');
        }
    }
}