Обновление пароля через админку

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
aleksandr.chirkov
Сообщения: 9
Зарегистрирован: 2019.02.24, 13:31

Обновление пароля через админку

Сообщение aleksandr.chirkov »

Уважаемые форумчане, добрый вечер!

У меня вопрос:

В админке у меня есть поле, вот такого вида:

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

<?= $editAccountForm->field($userModel,'pass',['options' => ['class' => 'edit-field'],])
            ->passwordInput()
            ->label('Смена пароля')
?>
Хочу по submit обновлять пароль:

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

//Еще код

$user = User::findOne($id); //Объект существует и берется правильно

if(!empty($_POST['User']['pass'])) 
            {
                $user->pass = $_POST['User']['pass']; //Значение ловится нормально
                $user->setPassword($user->pass); //У меня есть в модели public $pass;
                $user->generateAuthKey();
            }

            if($user->update(true,['username','fio','role','email','phone','img']))
            {
                Yii::$app->session->setFlash('edit');

                return Yii::$app->response->redirect(['account/index','name' => $user->username]);
            }
            else {
                    return var_dump($user->errors);
                }

Но при вызове update, все время ловлю var_dump - который к тому же ничего не показывает.
Подскажите пожалуйста, что я делаю не так?

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

А если это все же так, то как можно этот момент обойти? Пожалуйста подскажите!
Аватара пользователя
maleks
Сообщения: 1985
Зарегистрирован: 2012.12.26, 12:56

Re: Обновление пароля через админку

Сообщение maleks »

Думаю что в этом вызове
$user->update(true,['username','fio','role','email','phone','img'])
вы перечислили атрибуты которые надо сохранять, но среди них нет ни password ни authKey соответсвенно оно считает что сохранять ничего не надо, и не сохраняет, и возвращает 0 - кол-во affected rows
Yii2 universal module sceleton - for basic and advanced templates
aleksandr.chirkov
Сообщения: 9
Зарегистрирован: 2019.02.24, 13:31

Re: Обновление пароля через админку

Сообщение aleksandr.chirkov »

Спасибо Вам за ответ!

Но, если посмотреть на документацию:

public integer|false update ( $runValidation = true, $attributeNames = null )

То в первом аргументе, ставится true, для включения проверки валидации по модели, а во втором аргументе, будет передан атрибут/массив атрибутов, которые должны быть переданы для валидации, остальные все пропускаются.
Аватара пользователя
maleks
Сообщения: 1985
Зарегистрирован: 2012.12.26, 12:56

Re: Обновление пароля через админку

Сообщение maleks »

Так а модель валидацию и проходит. Признак этого что нет ошибок.


Да и вообще второй аргумент , который звучит как "list of attributes that need to be saved" никто никогда не использует.
Почему вы вам с моделями не работать как в доках, с ->load() , ->save(), а что нужно валидировать определяется сценарием
Yii2 universal module sceleton - for basic and advanced templates
aleksandr.chirkov
Сообщения: 9
Зарегистрирован: 2019.02.24, 13:31

Re: Обновление пароля через админку

Сообщение aleksandr.chirkov »

Уважаемый maleks - спасибо Вам за ответы. Я прислушался к совету и переделал все по документации, пока делал, нашел ошибку в коде, но уже решил сделать нормально и все получилось.

Единственное, я не очень понял, раньше я работал так сказать с живым массивом $_POST и брал оттуда значение.

например: $user->pass = $_POST['user']['pass'];

сейчас у меня обычный if($user->load(Yii::$app->request->post())) - который загружает весь пост в модель...Поле Pass, у меня как переменная в классе public $pass, поэтому значение передаваемое в этот инпут,

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

<?= $editAccountForm->field($userModel,'pass',['options' => ['class' => 'edit-field'],])
            ->passwordInput()
            ->label('Смена пароля')
?>[code]

появляется как бы в таком варианте

common\models\User Object
(
    [pass] => 
    [_attributes:yii\db\BaseActiveRecord:private] => Array
        (
            [id] => 2
            [username] => Suser
            [role] => teacher

и в последствии, я все равно делаю проверку:

if (!empty($user->pass)) {
                $user->setPassword($user->pass);
                $user->generateAuthKey();
            }

и далее update, но update без параметров и все работает.
Я что хочу сказать, по сути я код никак не поменял, но первая реализация не работает, а вторая работает - чудеса)
Ответить