【问题标题】:yii CUniqueValidator specify compare attributeyii CUniqueValidator 指定比较属性
【发布时间】:2013-05-10 21:11:16
【问题描述】:

我有一个注册表单,允许用户在表单字段email_or_phone 中输入他们的电子邮件或电话号码。我编写了一个验证函数,我在rules() 函数中使用它来确保提交的值是有效的电子邮件或电话号码。然后将该值分配给afterValidation() 函数中的正确模型属性。

我的问题是,模型属性 emailphone 应该是唯一的。我编写了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;
        }
    }
}

我做错了什么?

【问题讨论】:

标签: php validation yii


【解决方案1】:

只需为每个emailphone 使用CUniqueValidator,但配置'allowEmpty' = true

还为电子邮件和电话字段定义设置器,您可以在其中检查它是电话还是电子邮件并将其设置或留空。

要在email_or_phone 上获取唯一性错误消息,请添加来自emailphone 的消息。但要让它工作,需要一个小技巧。您必须将自己的验证规则定义为从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
}
}

【讨论】:

  • 我考虑过这种方法。但是使用这种方法,错误不会出现在email_or_phone 表单字段中。它会出现在email 表单字段或phone 表单字段中,而注册表单不包含这些。
  • 您可以另外在您的自定义验证方法中验证唯一性并将错误消息传递给它。
  • 我如何使用 yii CUniqueValidator 做到这一点?
  • 更新了我的答案,解释了如何将消息从 phone 添加到 email_or_phone
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-18
  • 1970-01-01
  • 1970-01-01
  • 2021-08-18
相关资源
最近更新 更多