Yii2 создать или обновить профиль пользователя - PullRequest
0 голосов
/ 20 сентября 2018

В моем базовом приложении у меня есть модель 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.');
    }
}

My 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(); ?>

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

1 Ответ

0 голосов
/ 21 сентября 2018

Ваш 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 - они не нужны и могут нарушать поведение атрибутов.

...