2013-05-16 2 views
1

У меня есть форма регистрации, которая позволяет пользователям вводить либо их адрес электронной почты, либо номер телефона в поле формы email_or_phone. Я написал функцию проверки, которую я использовал в функции rules(), чтобы гарантировать, что представленное значение является действительным адресом электронной почты или телефона. Затем значение присваивается правильному атрибуту модели в функции afterValidation().yii CUniqueValidator указать сравнительный атрибут

Моя проблема заключается в том, что атрибуты модели email и phone должны быть уникальными. Я написал функцию 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; 
     } 
    } 
} 

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

+0

Вы можете использовать вместо Yii встроен уникальный валидатор. Ссылка: http://www.yiiframework.com/doc/api/1.1/CUniqueValidator –

ответ

1

Просто используйте CUniqueValidator для каждого email и phone, но настройте 'allowEmpty' = true.

Также определите установщик для поля электронной почты и телефона, где вы проверяете, является ли это телефоном или электронной почтой, и установите его или оставьте пустым.

Чтобы получить сообщение об ошибке уникальности на email_or_phone, введите в него сообщения от email и phone. Но чтобы заставить его работать, нужен небольшой трюк. Вы должны определить свои собственные правила проверки, как отдельный класс, простирающейся от 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 
} 
} 
+0

Я рассматривал этот подход. Но при таком подходе ошибка не появляется в поле формы «email_or_phone». Он будет отображаться в поле формы «электронная почта» или в поле формы «phone», и форма регистрации не содержит ни одного из них. –

+0

Вы можете * дополнительно * проверить уникальность в своем специальном методе проверки и передать сообщение об ошибке. –

+0

Как это сделать, используя yii 'CUniqueValidator'? –

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