t-alexashka
@t-alexashka
Сразу пишу legacy код

Как подсунуть в форму редактирования данные из модели?

У меня есть форма для создания юзера (UserRegisterForm), и есть форма для редактирования юзера (UserEditForm). И есть собственно актив-рекорд модель самого юзера User.

У форм редактирования и создания юзеров немного разная валидация, соответственно это и было причиной разделить логику на 2 разные формы.

При редактировании юзера я рендерю форму редактирования стантартным способом:

действие к которому идет обращение через ажакс:

public function actionEdit($id) {

		$userId = (int)Yii::$app->request->get('id');
		$user = User::findOne($userId);
		$model = new UserEditForm();
		$model->load($user);
		
		return $this->renderAjax('_form-edit', [
			'model' => $model,
		]);

	}


и отдельное действие для ажакс-валидации этой формы:

public function actionValidate() {

		$model = new UserEditForm;
		
		if (Yii::$app->request->isAjax && $model->load(Yii::$app->request->post(), 'UserEditForm')) {
			Yii::$app->response->format = 'json';
			return ActiveForm::validate($model);
		} else {
			return 'NOT_AJAX OR FROM_NOT_LOADED';
		}

	}


Что я не правильно делаю? почему не работает валидация? Я жду на входе EditUserForm[], а приходит User. Как правильно сделать подсовывание в форму данных из модели, для редактирования? Передавать отдельными переменными во view-формы и там уже внедрять значения в поля? Я думал для этого и есть метод модели load(). Подскажите чайнику.

Сама модель формы редактирования:
https://gist.github.com/tihoho/164973535579ff1ef7a...
А так я ее рендерю:
https://gist.github.com/tihoho/4b68995ee99de96becb...
  • Вопрос задан
  • 282 просмотра
Решения вопроса 1
slo_nik
@slo_nik Куратор тега Yii
Добрый вечер.
Опять двадцать пять)))
Вот тут
$user = User::findOne($userId);
$model = new UserEditForm();

В $user Вы получаете заполненную модель из метода findOne(), а в форму передаёте $model, где содержится пустой экземпляр модели.
Вы хотите в одном действии объединить и создание новой записи и редактирование старой?
Зачем?
Разделите на два разных действия.

P.S.
И опять же, модель должна наследоваться от ActiveRecord в Вашем случае.
class User extends ActiveRecord
{
  // тут и правила проверки и соединение с таблицей и атрибуты и всё-всё.
}

И тогда два действия - actionCreate и actionUpdate
public function actionCreate() {
    $model = new UserEditForm();
    if($model->load($user) && $model->save()){
        // redirect при успешном сохранении модели
   }
    
    return $this->renderAjax('_form-edit', [
      'model' => $model,
    ]);

  }

public function actionUpdate($id) {

    $userId = (int)Yii::$app->request->get('id');
    $user = User::findOne($userId);
    if($model->load($user) && $model->save()){

     }
    
    return $this->renderAjax('_form-edit', [
      'model' => $model,
    ]);

  }


P.S.S
Документация
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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