我有一个注册表单,允许用户在表单字段email_or_phone
中输入他们的电子邮件或电话号码。我编写了一个验证函数,用于rules()
函数,以确保提交的值是有效的电子邮件或电话号码。然后将该值分配给afterValidation()
函数中的正确模型属性。
我的问题是,模型属性email
和phone
应该是唯一的。我编写了afterValidation()
函数来测试针对相应表列的唯一性。但是代码不起作用。以下是我的afterValidation()
函数:
protected function afterValidate(){
parent::afterValidate();
if(!$this->hasErrors() && $this->isNewRecord){
$validator = new CEmailValidator;
if($validator->validateValue($this->email_or_phone)){
$validator = new CUniqueValidator;
$validator->attributeName = 'email';
$validator->validate($model, 'email_or_phone');
if(!$this->hasErrors()) $this->email = $this->email_or_phone;
}else{
$validator = new CUniqueValidator;
$validator->attributeName = 'phone';
$validator->validate($model, 'email_or_phone');
if(!$this->hasErrors()) $this->phone = $this->email_or_phone;
}
}
}
我做错了什么?
只需为每个email
和phone
使用CUniqueValidator
,但要配置'allowEmpty' = true
。
还定义电子邮件和电话字段的setter,在该字段中您可以检查它是电话还是电子邮件,并将其设置为空。
要在email_or_phone
上获得唯一性错误消息,请添加来自email
和phone
的消息。但要让它发挥作用,需要一个小技巧。您必须将自己的验证规则定义为从CValidator
扩展的一个单独的类,这样您就可以从CUniqueValidator
:调用受保护的方法
class MyValidator extends CValidator
{
protected function validateAttribute($object, $attribute)
{
// Some validation:
if(!isPhoneOrEmail($object->$attribute))
{
$this->addError($attribute, 'This is not phone or email');
}
// Now check phone and email
$validator = new CuniqueValidator();
$validator->allowEmpty = true;
$validator->validateAttribute($object, 'phone');
// Now get errors for phone attribute
$errors = $object->getErrors('phone');
if($errors)
{
foreach($errors as $error)
{
$this->addError($attribute, $error);
}
}
// Same for email
}
}