@yazux

Формы yii2. Как обновит данные в БД используя модель?

Суть вопроса: При регистрации пользователь вводит свой email, логин и пароль, после регистрации в личном кабинете доступны ещё атрибуты, к примеру: дата рождения, имя, фамилия, изображение - аватар. Теперь нужно отредактировать эти данные. Создал форму и модель к ней, логика работы должна быть такая: при открытии страницы все поля для ввода уже заполнены текущими данными пользователя (т.к. редактировать можно постоянно не один раз), пользователь меняет все данные, они валидируются и отправляются в модель, там записываются в базу и контроллер возвращает пользователя в личный кабинет.
Вроде всё просто, но я не знаю:
1. Как сделать чтоб при открытии вьюхи с формой, поля были заполнены данными пользователя (Пока сделал так: в контроллере узнаём id пользователя, и возвращаем во вью все данные, во вьюхе пишем их в input'ы)
2. Главный вопрос, я не знаю как сделать правильную запись данных в БД с помощью модели. (Используя контроллер я реализовал это, но как сделать через модель - вопрос.)

Кто сталкивался, помогите пожалуйста. В гугле ничего подобного не нашёл.
  • Вопрос задан
  • 3285 просмотров
Решения вопроса 1
supervaleha
@supervaleha
Web-development
Ох, не верится мне, что в Гугле Вы подробно искали)) Но, дело житейское.
Идея:
1. В контроллере загружаем данные по пользователю в объект модели. Например:
$model = User::findOne( $someUserId ) ;

2. Передаем этот объект во вью, где при помощи виджета выводим список всех нужных полей.
<?php 
$form = ActiveForm::begin([
    'id'                          =>    'about-form',
    'method'                      =>    'post',
]); ?>
<?=  $form->field($model, 'name_first') ?>
<?=  $form->field($model, 'name_middle')?>
<button class="btn btn-lg btn-primary" type="submit">OK</button>
<?php ActiveForm::end(); ?>


3. Action формы с методом POST направляем на тот же контроллер и в нем проверяем, каким методом пришел запрос, проводим валидации и т.д. - после чего сохраняем:
if( \Yii::$app->getRequest()->isPost ){
            if( $model->load( \Yii::$app->request->post() ) && $model->validate() ){
                $model->save( false ) ;
             }
        }


Таким образом типовой метод в контроллере может иметь вид:
public function actionIndex()
    {
        // загружаем данные по ID
        $model = \app\models\User::findOne( $this->userId );
        // если POST - значит идет сохранение с формы
        if( \Yii::$app->getRequest()->isPost ){
            // если аттрибуты загрузились и отвалидировались - можно сохранять
            if( $model->load( \Yii::$app->request->post() ) && $model->validate() ){
                $model->save( false ); 
            }
        }
        // передаем объект во вью (если GET - исходные, если POST - обновленные)
        return $this->render('index', [
            'model'     =>  $model
        ]);
    }
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы