За последние 24 часа нас посетили 64295 программистов и 1754 робота. Сейчас ищут 870 программистов ...

[Yii Framework] Уникальный логин и обновление (validate)

Тема в разделе "Прочие вопросы по PHP", создана пользователем Invision, 29 янв 2012.

  1. Invision

    Invision Активный пользователь

    С нами с:
    26 фев 2009
    Сообщения:
    1.437
    Симпатии:
    1
    Адрес:
    Томск
    У каждого пользователя уникальный логин.
    При обновлении записи идет проверка:
    Код (Text):
    1. if(!$model->validate('имя_сценария'))
    2.     return  $model->getErrors();
    В случае успеха обновляем:
    Код (Text):
    1. $model->updateByPk({запись}, {параметры})
    При обновлении записи возникает ошибка т.к validate говорит что логин пользователя уже существует.
    Пришлось сделать костыль в методе afterValidate если у обновляемого юзера логин совпадает с тем который передали, убираем ошибку.. выглядет так:

    Код (Text):
    1.         public function afterValidate() {
    2.             $model = isset($_GET['id']) ? $this->findByPk((int)$_GET['id']) : Yii::app()->user->model();
    3.             if($model) {
    4.                 $errors = $this->getErrors();
    5.                 isset($errors['user_name']) && $this->attributes['user_name'] == $model->user_name && $this->clearErrors('user_name');
    6.             }
    7.             return parent::afterValidate();
    8.         }
    Есть другой способ? т.к при разработке другого модуля может быть похожая задача и такое решений ой как не нравится мне...

    Добавлено спустя 32 минуты 6 секунд:
    Поставил сценарий на обновление login не уникальный, добавил проверку в метод updateByPk:
    Код (Text):
    1. $attributes['user_name'] = $model->user_name != $attributes['user_name'] && !$this->model()->findByAttributes(array('user_name' => $attributes['user_name'])) ? $attributes['user_name'] : $model->user_name;
    один фиг костыль видимо по другому никак...
     
  2. yuri

    yuri Активный пользователь

    С нами с:
    16 янв 2012
    Сообщения:
    288
    Симпатии:
    2
    Не так делаешь...
    Код (PHP):
    1. $user = User::model()->findByPK(....); //нашли юзера
    2. if(!$user) $user = new User(); //если нету, создали нового
    3. ... делаем проверки и присваиваем атрибуты...
    4.  
    5. $user->save(); //сохраняем модель 
     
  3. Invision

    Invision Активный пользователь

    С нами с:
    26 фев 2009
    Сообщения:
    1.437
    Симпатии:
    1
    Адрес:
    Томск
    Спасибо, разобрался.
     
  4. jonny

    jonny Активный пользователь

    С нами с:
    15 фев 2012
    Сообщения:
    1
    Симпатии:
    0