Yii2 создать или обновить профиль пользователя

В моем базовом приложении у меня есть модель User и модель UserForm, которая хранит и обновляет пользователей в базе данных. Теперь у меня возникла проблема при обновлении профиля пользователя. Это обратная связь "Успешное обновление!" даже если новые данные не будут сохранены.

Мой стол:

Table name: User
Attributes: id, fname, mname, lname, address, username, auth_key, password_hash, password_reset_token, email, status, created_at, updated_at

Моя модель:

class UserForm extends Model
{
    public $fname;
    public $mname;
    public $lname;
    public $address;
    public $username;
    public $email;
    public $password_hash;


    /**
     * @inheritdoc
     */
    public function rules()
    {
        return [
            ['fname', 'required'],
            ['fname', 'trim'],

            ['mname', 'trim'],

            ['lname', 'required'],
            ['lname', 'trim'],

            ['address', 'required'],
            ['address', 'trim'],
            ['address', 'string', 'max' => 255],

            ['username', 'trim'],
            ['username', 'required'],
            ['username', 'unique', 'targetClass' => '\app\models\User', 'message' => 'This username has already been taken.'],
            ['username', 'string', 'min' => 4, 'max' => 255],   

            ['email', 'trim'],
            ['email', 'required'],
            ['email', 'email'],
            ['email', 'string', 'max' => 255],
            ['email', 'unique', 'targetClass' => '\app\models\User', 'message' => 'This email address has already been taken.'],

            ['password_hash', 'required', 'on' => 'insert'],
            ['password_hash', 'string', 'min' => 8],
        ];
    }

    public function beforeSave($insert) {
        if ($insert) {
            $this->setPassword($this->password_hash);
        } else {
            if (!empty($this->password_hash)) {
                $this->setPassword($this->password_hash);
            } else {
                $this->password_hash = (string) $this->getOldAttribute('password_hash');
            }
        }
        return parent::beforeSave($insert);
    }
}

Мой контроллер:

public function actionUpdate($id)
{
    $model = $this->findModel($id);
    $model->setAttribute('password_hash', null);

    if ($model->load(Yii::$app->request->post()) && $model->save()) {
        Yii::$app->session->setFlash('success', Yii::t('app', 'Successful update!'));            
        return $this->redirect(['overview']);
    } else {
        return $this->render('update', [
            'model' => $model,
        ]);
    }
}

protected function findModel($id) {
    if (($model = User::findOne($id)) !== null) {
        return $model;
    } else {
        throw new NotFoundHttpException('The requested page does not exist.');
    }
}

Мой view.php

    <?= $form->field($model, 'fname')->textInput(['autofocus' => true])->label('First Name') ?>
    <?= $form->field($model, 'mname')->textInput()->label('Middle Name') ?>
    <?= $form->field($model, 'lname')->textInput()->label('Last Name') ?>
    <?= $form->field($model, 'address')->textInput() ?>
    <?= $form->field($model, 'username')->textInput() ?>
    <?= $form->field($model, 'email') ?>
    <?= $form->field($model, 'password_hash')->passwordInput(['placeholder' => Yii::t('app', 'Password'), 'value' => ''])->label(false) ?>

    <div class="form-group">
        <?= Html::submitButton($model->isNewRecord ? Yii::t('app', 'Create') : Yii::t('app', 'Update'), ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?>
    </div>

<?php ActiveForm::end(); ?>

Вот некоторые шаги: yii2 пользователь CRUD создает или обновляет пароль

1 ответ

Решение

Ваш UserForm никогда не используется. Ваш findModel() возвращается UserТаким образом, вся проверка и сохранение выполняется User модель - я думаю, что она не имеет каких-либо правил проверки, поэтому $model->load() ничего не загружает.

Вы можете попытаться расширить модель формы из модели активной записи:

class UserForm extends User

И использовать его в findModel() или создайте отдельный метод для возврата модели формы:

protected function findFormModel($id) {
    if (($model = UserForm::findOne($id)) !== null) {
        return $model;
    } else {
        throw new NotFoundHttpException('The requested page does not exist.');
    }
}

Затем используйте этот метод в своем update действие. Не забудьте удалить старые свойства из UserForm - они не нужны и могут нарушать атрибуты поведения.

Другие вопросы по тегам