2014-02-18 3 views
0

Я построил форму, которая отображает существующее письмо пользователя, а затем запросит новое электронное письмо и письмо с подтверждением, чтобы убедиться, что они набрали его правильно. Поле для нового письма - «new_email», поле подтверждения - «new_email_confirm». Модель уже имеет поле «электронная почта», где хранится их существующий адрес электронной почты. Используемый сценарий - «change_email». Каждое другое правило работает и проверяется с ошибками в моей модели, но это ... когда я вхожу в то же самое электронное письмо/подтверждение, которое уже принято в «электронной почте», я не получаю сообщение об ошибке, его можно сохранить.Yii: Уникальный адрес электронной почты при проверке правил не работает

В правилах, я добавил следующее:

array(
    'new_email,new_email_confirm', 
    'required', 
    'message'=>'This is a required field', 
    'on'=>'change_email', 
), 
    array(
    'new_email', 
    'email', 
    'message'=>'Invalid email address', 
    'on'=>'change_email', 
), 
    array(
    'new_email', 
    'compare', 
    'compareAttribute'=>'new_email_confirm', 
    'message'=>"Emails don't match", 
    'on'=>'change_email', 
), 
    array(
    'new_email', 
    'unique', 
    'className'=>'User', 
    'attributeName'=>'email', 
    'on'=>'change_email', 
), 

Что я делаю неправильно?

+1

Опубликовать все ваши правила –

+0

Все правила добавлены @ samuel-liew, спасибо, что посмотрели. – ews2001

+0

Вопрос, что такое тестовый пример? Имеет ли в нем несколько ошибок во все времена или по одному за раз? Если первое (несколько ошибок на тест), правило 'unique' пропускается [по умолчанию] (http://www.yiiframework.com/doc/api/1.1/CUniqueValidator#skipOnError-detail), если еще одна ошибка уже произошла. –

ответ

0

У меня есть два грязных предложения для этого, так как я не могу узнать, в чем проблема.

1- Напишите пользовательские проверки для уникальности и удалить unique правило:

array('new_email','customValidationRule'), 

и записать его, как показано ниже:

public function customValidationRule(){ 
    //after all validation rules 
    if(!$this->hasErrors()){ 
     $check=User::model()->findByAttributes(array('email'=>$this->new_email)); //or $this->new_email_confirm 
     if(!is_null($check) || !empty($check)){ 
      $this->addError('new_email','The new email has been already taken by other!'); 
     } 
    } 
} 

2- заменить new_email с new_email_confirm в вашем unique правила ,

+0

Прошу прощения, если это нежелательный ответ. Я опубликовал этот ответ так же, как альтернативное решение :) –

+1

Я пробовал ваше собственное правило проверки, и оно сработало! Мне просто жаль, что я не смогу заставить его работать с уникальным валидатором Yii, показанным выше, но в любом случае ваше решение действительно сработало для меня. – ews2001

Смежные вопросы