Редактирование профиля юзера и отдельная смена пароля

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
Аватара пользователя
greatdane
Сообщения: 408
Зарегистрирован: 2010.10.20, 14:05
Откуда: Электросталь
Контактная информация:

Редактирование профиля юзера и отдельная смена пароля

Сообщение greatdane »

Сделала авторизацию и распределение ролей по этому рецепту: http://yiiframework.ru/doc/cookbook/ru/access.rbac.file
Но теперь не могу сообразить, как сделать раздельно редактирование профиля и смену пароля.
Убрала password из safe-атрибутов модели. В форме редактирования профиля тоже этого поля нет. Тем не менее, при сохранении профиля пароль меняется - видимо, срабатывает указанное по рецепту в модели:

Код: Выделить всё

protected function beforeValidate(){
    $this->password = md5($this->password);
        return parent::beforeValidate();
    } 
Пробовала в эту функцию добавлять проверки - если не пустое, если не пустая строка, если не NULL, если не false - однофигственно пароль меняется. Как правильно подружить эту функцию beforeValidate с редактированием профиля без смены пароля?
zibert02
Сообщения: 203
Зарегистрирован: 2010.11.24, 17:29

Re: Редактирование профиля юзера и отдельная смена пароля

Сообщение zibert02 »

попробуйте сделать password safe и затем проверяйте if ($this->password!= '') $this->password = md5($this->password);
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: Редактирование профиля юзера и отдельная смена пароля

Сообщение slavcodev »

Познай силу сценариев в моделях!

Код: Выделить всё

class User extends CActiveRecord {
    protected function beforeValidate(){
        if($this->scenario!='editProfile')
                $this->password = md5($this->password);
        return parent::beforeValidate();
    }
} 
Жду Yii 3!
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: Редактирование профиля юзера и отдельная смена пароля

Сообщение slavcodev »

greatdane писал(а):Убрала password из safe-атрибутов модели
покажи все правила, учти что если password участвует хотя бы в одном правиле, он автоматически становится безопасным
Жду Yii 3!
Аватара пользователя
greatdane
Сообщения: 408
Зарегистрирован: 2010.10.20, 14:05
Откуда: Электросталь
Контактная информация:

Re: Редактирование профиля юзера и отдельная смена пароля

Сообщение greatdane »

mc-bear писал(а): покажи все правила, учти что если password участвует хотя бы в одном правиле, он автоматически становится безопасным

Код: Выделить всё

public function rules()
    {
        // NOTE: you should only define rules for those attributes that
        // will receive user inputs.
        return array(
            array('email', 'required'),
            array('name_eng,name_rus', 'unique','message'=>'Such a real name is already in the database'),
            array('username', 'unique', 'message'=>'Login must be unique. Such an entered login is already in the database', 'on'=>'create'),
            array('username', 'length', 'max'=>140),
            array('photo_name', 'file','maxSize'=>2097152,'types'=>'jpg,png,gif','allowEmpty'=>true),
            array('email', 'email'),
            array('role', 'length', 'max'=>20),
            array('visits', 'length', 'max'=>11),
            array('vs_code', 'length', 'max'=>100),
            array('name_eng, name_rus, breeds_eng, breeds_rus, area_rus, area_eng, contact_rus, contact_eng, email, date_birth, description_rus, description_eng, site_URL', 'safe'),
            // The following rule is used by search().
            // Please remove those attributes that should not be searched.
            array('id, username, role, name_eng, name_rus, breeds_eng, breeds_rus, area_rus, area_eng, contact_rus, contact_eng, email, photo_name, date_birth, description_rus, description_eng, visits, site_URL, date_reg, vs_code', 'safe', 'on'=>'search'),
            array('old_photo', 'safe', 'on'=>'edit'),//вспомогательный элемент для загрузки фото
        );
    } 
Вроде бы нигде нету?!
Аватара пользователя
greatdane
Сообщения: 408
Зарегистрирован: 2010.10.20, 14:05
Откуда: Электросталь
Контактная информация:

Re: Редактирование профиля юзера и отдельная смена пароля

Сообщение greatdane »

mc-bear писал(а):Познай силу сценариев в моделях!
Если у меня сценарий в контроллере называется edit - то соответственно мне нужно написать

Код: Выделить всё

class User extends CActiveRecord {
    protected function beforeValidate(){
        if($this->scenario!='edit')
                $this->password = md5($this->password);
        return parent::beforeValidate();
    }
} 
- так? А в самом контроллере ничего не нужно дополнительно прописывать?
zibert02
Сообщения: 203
Зарегистрирован: 2010.11.24, 17:29

Re: Редактирование профиля юзера и отдельная смена пароля

Сообщение zibert02 »

может лучше использовать сценарий insert?
if($this->scenario=='insert')
$this->password = md5($this->password);
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: Редактирование профиля юзера и отдельная смена пароля

Сообщение slavcodev »

Да нет. Тогда видимо только то что перед каждой валидацией оно хеширется.
Значит решение: либо хешировать только при некоторых сценариях (там где меняются пароли)
либо только если пароль изменился (сохранить пароль из базы в afterFind)
Жду Yii 3!
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: Редактирование профиля юзера и отдельная смена пароля

Сообщение slavcodev »

greatdane писал(а):Если у меня сценарий в контроллере называется edit - то соответственно мне нужно написать
edit - когда? когда выводишь форму пароля или профиля?
greatdane писал(а):А в самом контроллере ничего не нужно дополнительно прописывать?
в контроллере в действии где меняется профиль

Код: Выделить всё

new User('editProfile') 
в дествии которое меняет пароль

Код: Выделить всё

new User('editPassword') 
Жду Yii 3!
Аватара пользователя
greatdane
Сообщения: 408
Зарегистрирован: 2010.10.20, 14:05
Откуда: Электросталь
Контактная информация:

Re: Редактирование профиля юзера и отдельная смена пароля

Сообщение greatdane »

mc-bear писал(а): edit - когда? когда выводишь форму пароля или профиля?
Профиля

mc-bear писал(а): в контроллере в действии где меняется профиль
new User('editProfile')
в дествии которое меняет пароль
new User('editPassword')
Вот тут вообще не въезжаю... ведь это не новая модель, а загрузка из базы по первичному ключу - редактирование же, а не создание.
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: Редактирование профиля юзера и отдельная смена пароля

Сообщение slavcodev »

greatdane писал(а):Вот тут вообще не въезжаю... ведь это не новая модель, а загрузка из базы по первичному ключу - редактирование же, а не создание.
в спешке писал, это хотел написать

Код: Выделить всё

$user=User::model()->findByPk(1);
$user->setScenario('editPassword'); 
Жду Yii 3!
Аватара пользователя
greatdane
Сообщения: 408
Зарегистрирован: 2010.10.20, 14:05
Откуда: Электросталь
Контактная информация:

Re: Редактирование профиля юзера и отдельная смена пароля

Сообщение greatdane »

Вот спасибо огромное! Заработало :-) И теперь окончательно понятно, как пользоваться сценариями - очень удобно!
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: Редактирование профиля юзера и отдельная смена пароля

Сообщение slavcodev »

greatdane писал(а):

Код: Выделить всё

protected function beforeValidate(){
    $this->password = md5($this->password);
        return parent::beforeValidate();
    } 
и еще я вспомнил свой метод для пароля пользователя, я отказался от ивента beforeValidate, хеширую при помощи правила валидации

Код: Выделить всё

public function rules()
{
   array('password','hashPassword','on'=>'register,editPassword'),
   array('confirmPassword','hashPassword','on'=>'register,editPassword'),
}
public function hashPassword($attribute,$params)
{
   return md5($this->$attribute)
} 
Жду Yii 3!
zibert02
Сообщения: 203
Зарегистрирован: 2010.11.24, 17:29

Re: Редактирование профиля юзера и отдельная смена пароля

Сообщение zibert02 »

а как оно сработает, если юзер не введет пароль? он не хочет менять пароль, а хеш от пустоты будет хеш и перезатрет пароль в базе
Аватара пользователя
greatdane
Сообщения: 408
Зарегистрирован: 2010.10.20, 14:05
Откуда: Электросталь
Контактная информация:

Re: Редактирование профиля юзера и отдельная смена пароля

Сообщение greatdane »

zibert02 писал(а):а как оно сработает, если юзер не введет пароль? он не хочет менять пароль, а хеш от пустоты будет хеш и перезатрет пароль в базе
Что-то я плохо себе представляю, зачем юзеру переться на страницу смены пароля и отправлять форму, если он не хочет менять пароль... а какова альтернатива? Я примерно так же себе представляла смену пароля, только до правил валидации не додумалась. beforeValidate точно так же затрет пароль, если ничего не вводить.
zibert02
Сообщения: 203
Зарегистрирован: 2010.11.24, 17:29

Re: Редактирование профиля юзера и отдельная смена пароля

Сообщение zibert02 »

ну если на странице будет только смена пароля то ок
но обычно юзеру показывается весь его профиль а внизу еще 2 поля для пароля, если они пустые то пароль не меняется
Аватара пользователя
greatdane
Сообщения: 408
Зарегистрирован: 2010.10.20, 14:05
Откуда: Электросталь
Контактная информация:

Re: Редактирование профиля юзера и отдельная смена пароля

Сообщение greatdane »

zibert02 писал(а):ну если на странице будет только смена пароля то ок
но обычно юзеру показывается весь его профиль а внизу еще 2 поля для пароля, если они пустые то пароль не меняется
Вообще-то в заголовке темы подчеркнуто, что я хочу отделить смену пароля от редактирования профиля. Об этом и речь.
Ответить