myks92
@myks92
Нашёл решение — пометь вопрос ответом!

Как сохранить две модели и табличный ввод + Tabular Input?

Всем привет! Наверное, уже надоели мои глупые вопросы, но прошу помощи :D Пока что ещё не очень хорошо освоил табличный ввод. Особенно в связке с другой моделью.

У меня есть две таблицы:
reg_event (Регистрация на мероприятие)
//Здесь данные о регистрации на мероприятие (дата регистрации, куда, на какое мероприятие и так далее)
user (пользователи системы)
//Здесь данные о пользователе
reg_event_user
//здесь два поля
-reg_event_id (id регистрации из таблицы reg_event)
-user_id

У каждой регистрации может быть от 1 до 25 участников. Поэтому у нас имеется дополнительная таблица reg_event_user. Мы создаем новую регистрацию заполняем данные, которые записываются в таблицу reg_event и затем добавляем от 1 до 25 человек, которые записываются в нашу дополнительную таблицу.

Для добавления новых участников использую расширение TabularInput

Контроллер

У меня получился такой код контроллера:

public function actionCreate()
    {
        $event_id = RegEvent::getEventId();
        $number = RegEvent::setNumber();

        $request = Yii::$app->request;
        $model = new RegEvent(['number'=> $number, 'event_id' => $event_id]);
        $models = [new RegEventUser()];

        if (!isset($model, $models)) {
            throw new NotFoundHttpException("The user was not found.");
        }

        $model->scenario = $model::SCENARIO_FRONTEND;

        if ($request->isPost && $request->post('ajax') !== null) {
            $data = Yii::$app->request->post('RegEventUser', []);
            foreach (array_keys($data) as $index) {
                $models[$index] = new RegEventUser(['reg_event_id' => $model->id]);
            }
            Model::loadMultiple($models, $request->post());
            Yii::$app->response->format = Response::FORMAT_JSON;
            $result = ActiveForm::validateMultiple($models);
            return $result;
        }

        if ($model->load($request->post()) && $model->save() && Model::loadMultiple($models, $request->post())) {
            return $this->redirect(['index']);
        }

        if (Yii::$app->request->isAjax){
            return $this->renderAjax('_form', [
                'model' => $model,
                'models' => $models,
            ]);

        }

        return $this->render('create', [
            'model' => $model,
            'models' => $models,
        ]);
    }

Форма
<?php $form = ActiveForm::begin([
        //'enableAjaxValidation'      => true,
        //'enableClientValidation'    => false,
        'validateOnChange'          => false,
        'validateOnSubmit'          => true,
        'validateOnBlur'            => false,
        'options' => ['enctype' => 'multipart/form-data']
    ]); ?>

    <?= $form->errorSummary($model)?>


    <?= $form->field($model, 'rang_id')->widget(Select2::classname(), [
        'data' => RegEventRule::getRangs(),
        'options' => ['placeholder' => 'Выберите ранг ...'],
    ]);?>

    <?= $form->field($model, 'discipline_id')->widget(Select2::classname(), [
        'data' => RegEventRule::getDisciplines(),
        'options' => ['placeholder' => 'Выберите дисциплину ...'],
    ]);?>

    <?= $form->field($model, 'nomination_id')->widget(Select2::classname(), [
        'data' => RegEventRule::getNominations(),
        'options' => ['placeholder' => 'Выберите номинацию ...'],
    ]);?>

    <?= $form->field($model, 'category_id')->widget(Select2::classname(), [
        'data' => RegEventRule::getCategories(),
        'options' => ['placeholder' => 'Выберите категорию ...'],
    ]);?>

    <?= TabularInput::widget([
        //'min' => 1,
        'models' => $models,
        'attributeOptions' => [
            //'enableAjaxValidation'      => true,
            //'enableClientValidation'    => false,
            'validateOnChange'          => false,
            'validateOnSubmit'          => true,
            'validateOnBlur'            => false,
        ],
        'columns' => [
            [
                'name'  => 'user_id',
                'type'  => Select2::className(),
                'options' => [
                    'data' => Profile::getDancers(),
                    'options' => ['placeholder' => 'Выберите танцора ...'],
                ]
            ],
        ]
    ]); ?>



Массив данных приходит в таком виде
5b24251cb76a5572191914.png
Другие визуализации для понимания
5b24253c954a5729932324.png5b2425577db67254925770.png


Помогите и подскажите что не так я делаю? И почему не сохраняются данные в дополнительную таблицу? Видимо я ещё не указал сохранение в табличном вводе, но как это все связать?)
  • Вопрос задан
  • 179 просмотров
Решения вопроса 1
slo_nik
@slo_nik Куратор тега Yii
if ($model->load($request->post()) && $model->save() && Model::loadMultiple($models, $request->post())) {
      foreach ($models as $mod) {
          $new_model = new RegEventUser(); // модель связующей таблицы?
          $new_model->reg_event_id = $model->id;
          // заполняете ещё один атрибут
          $new_model->save(false);
      }
      return $this->redirect(['index']);
 }
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы