1

我有一个 Yii 表单接受,first name来自用户。使用链接,用户可以添加这三个元素的多行。last nameemailadd more

对于电子邮件验证,uniquerequired在模型规则中设置,一切正常。我正在使用 JavaScript 在单击add more链接时创建附加行。

问题

在第一行我的值是John, Newman, johnnewman@gmail.com和第二行,我正在输入Mathew, Heyden, johnnewman@gmail.com。在这种情况下,电子邮件地址是重复的。没有任何验证规则 (requireunique) 能够验证这一点。有人可以提出一种更好的方法来验证这一点吗?

更新: 我创建了一个自定义验证函数,我想这足以解决我的问题。有人可以告诉我如何在自定义验证功能中访问整个form data/吗?post data

public function uniqueOnForm($attribute){ 
            // This post data is not working
            error_log($_REQUEST, true);
            $this->addError($attribute, 'Sorry, email address shouldn\'t be repeated');
        }
4

3 回答 3

1

你可以试试这个:

<?php
public function rules()
{
    return array(
        array('first_name', 'checkUser')
    );
}

public function checkUser($attribute)
{
    if($this->first_name == $this->other_first_name){
         $this->addError($attribute, 'Please select another first name');
    }
}
?>

您还可以查看此扩展程序

于 2015-09-10T07:56:33.770 回答
0

您可以编写自定义验证器:

//protected/extensions/validators
class UniqueMailValidator extends CValidator
{

    /**
     * @inheritdoc
     */
    protected function validateAttribute($object, $attribute)
    {
        $record = YourModel::model()->findAllByAttributes(array('email' => $object->$attribute));
        if ($record) {
            $object->addError($attribute, 'Email are exists in db.');
        }
    }
}

// in your model
public function rules()
{
    return array(
        array('email', 'ext.validators.UniqueMailValidator'),
    ...

或者更好地尝试使用这个

于 2015-09-10T08:43:32.013 回答
0
public function rules(){
    return array(
       //other rules
       array('email', 'validEmail'),
    )

}

public function validEmail($attribute, $params){
    if(!empty($this->email) && is_array($this->email)){
       $isduplicate = $this->isDuplicate($this->email);
       if($isduplicate){
           $this->addError('email', 'Email address must be unique!');
       }
    }
}

private function isDuplicate($arr){
    if(count(array_unique($arr)) < count($arr)){
        return true;
    }
    else {
        return false;
    }
}

因为您使用的是表格输入(多行),所以请确保输入字段为数组。可能是这样的:

<?php echo $form->textField($model, 'email[]'); ?>
于 2015-09-10T10:31:39.500 回答