简体   繁体   中英

Unique email values from a Yii 1.1 dynamic form

I have a Yii form accept first name , last name and email from user. Using an add more link, users can add multiple rows of those three elements.

For email validation, unique and required are set in model rules and everything works fine. I am using JavaScript to create addition row on clicking add more link.

Problem

On the first row my values are John, Newman, johnnewman@gmail.com and the second row, i'm entering Mathew, Heyden, johnnewman@gmail.com . In this case email address is duplicated. None of the validation rules ( require and unique ) is capable of validating this. Can some one suggest a better method to validate this ?

Update: I created a custom validation function and i guess this is enough to solve my problem. Can someone tell me how to access the whole form data / post data in a custom validation function ?

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

You can try this:

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

You can also look into this extension

You can write custom validator:

//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'),
    ...

Or better try to use THIS

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

because you are using tabular input (multiple row) , so make sure input field as an array. might be like this :

<?php echo $form->textField($model, 'email[]'); ?>

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM