Уникальные значения электронной почты из динамической формы Yii 1.1

У меня есть форма Yii принять first name, last name а также email от пользователя. Используя add more По ссылке пользователи могут добавить несколько строк из этих трех элементов.

Для проверки электронной почты, unique а также required установлены в правилах модели, и все работает нормально. Я использую JavaScript для создания дополнительной строки при нажатии add more ссылка на сайт.

проблема

В первом ряду мои значения John, Newman, johnnewman@gmail.com и второй ряд, я вхожу Mathew, Heyden, johnnewman@gmail.com, В этом случае адрес электронной почты дублируется. Ни одно из правил проверки (require а также unique) способен подтвердить это. Кто-нибудь может предложить лучший метод для проверки этого?

Обновление: я создал пользовательскую функцию проверки, и я думаю, этого достаточно, чтобы решить мою проблему. Может кто-нибудь сказать мне, как получить доступ ко всему 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');
        }

3 ответа

Вы можете попробовать это:

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

Вы также можете посмотреть в это расширение

Вы можете написать собственный валидатор:

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

Или лучше попробуйте использовать ЭТО

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[]'); ?>
Другие вопросы по тегам