Добрый вечер!
Подскажите, как сделать чтобы при обновлении записи пользователя пароль его не менялся т.к. там md5, и где лучше при регистрации/изменении пароля шифровать его в md5, я делаю это в beforeSave, но столкнулся с проблемой что при редактировании записи существующий хеш снова хеширутеся.
В «чистом» yii, нету db-авторизации. Скорее всего вы используете либо какой-то skeleton(сборку), либо экстеншн.
Смотреть надо UserIdenity, WebUser, но в первую очередь код модели, типа user.
Вы не так поняли, мне не надо авторизацию, мне надо чтобы поле пароль при редактировании записи не менялось… Мне надо сделать поля профиля редактируются в одном месте, а пароль изменяется в другом месте, пробовал задавать сценарии не помогает
Да, тогда если я правильно понял задача — отследить измененил пользователь пароль или нет.
Вариантов реализации много, например можно сделать так:
1)
в AfterFind сохраняете текущее значение. private $_oldAttributes; .... public function afterFind() { $this->_oldAttrbiutes = $this->attributes; }
Тогда в beforeSave легко определить — изменился пароль пользователем или нет — сравнив значения _oldAttributes или текущее, если изменился — md5.
2) По хорошему — пароль нигде не должен фигурировать, даже в md5, даже с солью, поэтому
а) в afterFind вы просто затираете вывод пароля, в контроллере проверяете значение поля с паролем, если strlen>1(!="") делаете unset() и передаете в setAttributes.
3) Можно перегрузить setAttributes и сделать проверку в нем.
Многолетяя практика с Yii показала, что помещать код меняющий данные в beforeSave можно только в случае крайней необхлдимости. В большинстве случаев лучше вынести код в отдельный метод и вызывать из контроллера — и проблем таких не возникает, и в коде потом разобраться легче. Также, если приходится пред сохранением/извлечением менять данные полей, то зачастую проще потратить время на создание формы, а не работать напрямую через модель.