Загрузка данных в две таблицы из одного view

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Adigezalov
Сообщения: 51
Зарегистрирован: 2017.10.14, 23:52

Загрузка данных в две таблицы из одного view

Сообщение Adigezalov »

Всем привет в очередной раз)
У меня новый ступор... Прошу помощи у гуру :D

Ситуация такая:
Есть три таблицы:

Первая таблица products

Код: Выделить всё

id, name
Вторая таблица characteristics

Код: Выделить всё

id, name
Третья таблица product__сharacteristics

Код: Выделить всё

id, id_product, id_characteristics, value
Таблица characteristics заполняется отдельно по мере необходимости, то есть количество строк там всегда меняется и нельзя ко всем товарам отнести все строки данной таблицы (то есть у часов могут быть одни характеристики, а у телевизора совсем другие, но названия берутся из одной таблицы).

Таблицы products и product__сharacteristics заполняются одновременно из одного и того же view. При создании товара в админке заполняются основные поля products и тут же нужно заполнить поля, которые далее будут сохранены в product__сharacteristics, для этого нужно сделать некое поле, в котором выбираем характеристику, записываем ее значение и нажимаем сохранить и так несколько раз, пока не запишем все нужные характеристики.

Собственно вопрос... Как это все реализовать? :D

Как это вижу я своим junior-взглядом:
1. Делаем две модели: products и product__сharacteristics
2. Делаем один контроллер ProductController
3. Создаем в контроллере две модели

Код: Выделить всё

$model = new Product();
$model_ = new ProductCharacteristics;
4. Выносим формы для заполнения в один view
5. Для заполнения формы ProductCharacteristics делаем два поля, в одном выбираем характеристику, во втором записываем значение, нажимаем сохранить, значение сохраняется в массиве в сессии.
6. Заполняем поля для формы Product
7. Нажимаем кнопку ГОТОВО, форма Product сохраняется в таблицу Product, а вот данные из сессии сохраняются в ProductCharacteristics

Верно?
Аватара пользователя
rugabarbo
Сообщения: 1063
Зарегистрирован: 2015.06.21, 16:21
Контактная информация:

Re: Загрузка данных в две таблицы из одного view

Сообщение rugabarbo »

Зачем нужна сессия на шагах 5, 7?
Adigezalov
Сообщения: 51
Зарегистрирован: 2017.10.14, 23:52

Re: Загрузка данных в две таблицы из одного view

Сообщение Adigezalov »

rugabarbo писал(а): 2018.01.09, 10:08 Зачем нужна сессия на шагах 5, 7?
Потому что у каждого продукта может быть не одна характеристика, а выводить все имеющиеся характеристики для их заполнения бессмысленно, потому что часть из них может вообще к товару не относиться. Вот я и подумал, что можно вывести для заполнения только одно поле, а введенные в него данные постоянно куда-то сохранять и очищать его для следующего ввода, но лучше, чем сессию ничего не придумал, чтобы временно хранить данные
Аватара пользователя
rugabarbo
Сообщения: 1063
Зарегистрирован: 2015.06.21, 16:21
Контактная информация:

Re: Загрузка данных в две таблицы из одного view

Сообщение rugabarbo »

Adigezalov писал(а): 2018.01.09, 10:11
rugabarbo писал(а): 2018.01.09, 10:08 Зачем нужна сессия на шагах 5, 7?
Потому что у каждого продукта может быть не одна характеристика, а выводить все имеющиеся характеристики для их заполнения бессмысленно, потому что часть из них может вообще к товару не относиться. Вот я и подумал, что можно вывести для заполнения только одно поле, а введенные в него данные постоянно куда-то сохранять и очищать его для следующего ввода, но лучше, чем сессию ничего не придумал, чтобы временно хранить данные
Тогда вам следует начать с интерфейса.

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

И т.д.

Иначе я, например, не понимаю, как именно будет реализован UI.
Adigezalov
Сообщения: 51
Зарегистрирован: 2017.10.14, 23:52

Re: Загрузка данных в две таблицы из одного view

Сообщение Adigezalov »

Интерфейс будет такой:
В вопросе, конечно, все было упрощенно)
Изображение

Справа как раз нужно добавить те самые характеристики, если я правильно понимаю, то для них нужно сделать отдельную Active Form?
Аватара пользователя
rugabarbo
Сообщения: 1063
Зарегистрирован: 2015.06.21, 16:21
Контактная информация:

Re: Загрузка данных в две таблицы из одного view

Сообщение rugabarbo »

Что-то не загружается изображение.
Аватара пользователя
rugabarbo
Сообщения: 1063
Зарегистрирован: 2015.06.21, 16:21
Контактная информация:

Re: Загрузка данных в две таблицы из одного view

Сообщение rugabarbo »

Adigezalov писал(а): 2018.01.09, 11:39 А отсюда?
https://yadi.sk/i/YW9L4Gm_3RHcAv
Здесь удалось посмотреть UI. Это страница добавления товара.

Предположим, мы всё заполнили и нажали внизу зелёную кнопку "Готово". Что дальше?
Насколько я понял, будут появляться одна за другой формы для вбивки каждой отдельной характеристики? Есть скриншот последующих форм?
Adigezalov
Сообщения: 51
Зарегистрирован: 2017.10.14, 23:52

Re: Загрузка данных в две таблицы из одного view

Сообщение Adigezalov »

Нет, не верно. Добавление должно происходить до нажатия кнопки готово. На картинке справа есть раздел "характеристики". Именно там я планировал сделать поле для ввода характеристик. А сохраниться все должно после нажатия на Готово.

Справа будет 2 поля, в одном из списка выбираем характерисьику, во второе вводим значение. Там же планируется еще одна кнопка, например, "сохранить". После ее нажатия в сессию, например, с названием charac добавится элемент массива с полями: id_products, id_characteristics и value, а сами поля в форме обнулятся и так нужно будет сделать N раз

После чего нажимаем Готово и все должно везде сохраниться)

P.S. ну это все в теории... в моей телрии
Adigezalov
Сообщения: 51
Зарегистрирован: 2017.10.14, 23:52

Re: Загрузка данных в две таблицы из одного view

Сообщение Adigezalov »

Может есть какие-то другие предложения по данному вопросу, может я иду не по рациональному пути?
Аватара пользователя
rugabarbo
Сообщения: 1063
Зарегистрирован: 2015.06.21, 16:21
Контактная информация:

Re: Загрузка данных в две таблицы из одного view

Сообщение rugabarbo »

Adigezalov писал(а): 2018.01.09, 11:50 Нет, не верно. Добавление должно происходить до нажатия кнопки готово. На картинке справа есть раздел "характеристики". Именно там я планировал сделать поле для ввода характеристик. А сохраниться все должно после нажатия на Готово.

Справа будет 2 поля, в одном из списка выбираем характерисьику, во второе вводим значение. Там же планируется еще одна кнопка, например, "сохранить". После ее нажатия в сессию, например, с названием charac добавится элемент массива с полями: id_products, id_characteristics и value, а сами поля в форме обнулятся и так нужно будет сделать N раз

После чего нажимаем Готово и все должно везде сохраниться)
Ну вот, уже более менее ясное ФЗ.

Обычно в таких случаях делают т.н. "динамическую форму". Например:

Код: Выделить всё

Характеристика: [дропдаун]           Значение: ______________
[+ Добавить ещё одну]
При нажатии на кнопку "Добавить ещё одну" в форму добавляется ещё одна характеристика. Всё это обрабатывается в браузере без обращений к серверу (ну или с AJAX-подгрузками дропдаунов), после чего отправляется на сервер единым запросом (товар + все характеристики).
Adigezalov
Сообщения: 51
Зарегистрирован: 2017.10.14, 23:52

Re: Загрузка данных в две таблицы из одного view

Сообщение Adigezalov »

На данный момент, я пока не могу и простую форму вывести))
Есть контроллер:

Код: Выделить всё

public function actionCreate()
    {
        $model = new Products();
        $model_ = new ProductsCharacteristics();

        if ($model->load(Yii::$app->request->post()) && $model->save()) {
            return $this->redirect(['view', 'id' => $model->id]);
        }

        return $this->render('create', [
            'model' => $model,
            'model_' => $model_,

        ]);
    }
Во view у меня примерно следующий код:

Код: Выделить всё

.....
<?php $form = ActiveForm::begin(); ?>
//здесь идут инпуты по модели $model
<?= $form->field($model, 'name')->textInput(['maxlength' => true])->error(false) ?>
<?php ActiveForm::end(); ?>
....
<?php $form = ActiveForm::begin(); ?>
//здесь идут инпуты по модели $model_
<?= $form->field($model_, 'id_characteristic')->textInput()->error(false) ?>
<?php ActiveForm::end(); ?>
Но выдают ошибку:

Код: Выделить всё

Call to a member function isAttributeRequired() on null
если убрать второй ActivForm, то все работает
Аватара пользователя
rugabarbo
Сообщения: 1063
Зарегистрирован: 2015.06.21, 16:21
Контактная информация:

Re: Загрузка данных в две таблицы из одного view

Сообщение rugabarbo »

Потому что у вас id_characteristicS должно быть. Последняя "S" есть.
И модели назовите нормально, $model_ – это трэш.
Adigezalov
Сообщения: 51
Зарегистрирован: 2017.10.14, 23:52

Re: Загрузка данных в две таблицы из одного view

Сообщение Adigezalov »

rugabarbo писал(а): 2018.01.09, 16:41 Потому что у вас id_characteristicS должно быть. Последняя "S" есть.
И модели назовите нормально, $model_ – это трэш.
У меня именно id_characteristic должно быть =)
Вот вырезка из модели:

Код: Выделить всё

public function rules()
    {
        return [
            [['id_product', 'id_characteristic'], 'required'],
            [['id_product', 'id_characteristic'], 'integer'],
            [['created_at', 'updated_at'], 'safe'],
            [['value'], 'string', 'max' => 255],
        ];
    }
А с названиями моделей и правда треш)
Аватара пользователя
rugabarbo
Сообщения: 1063
Зарегистрирован: 2015.06.21, 16:21
Контактная информация:

Re: Загрузка данных в две таблицы из одного view

Сообщение rugabarbo »

Вы ранее скидывали вот это:
Adigezalov писал(а): 2018.01.09, 09:46 Вторая таблица characteristics

Код: Выделить всё

id, name
Третья таблица product__сharacteristics

Код: Выделить всё

id, id_product, id_characteristics, value
Если в базе всё именно так, то и в ActiveRecord оно мапится именно так (с буквой S на конце).
Adigezalov
Сообщения: 51
Зарегистрирован: 2017.10.14, 23:52

Re: Загрузка данных в две таблицы из одного view

Сообщение Adigezalov »

Не, это я в дороге по памяти писал, а сейчас 100% могу сказать, что без буквы S
Аватара пользователя
rugabarbo
Сообщения: 1063
Зарегистрирован: 2015.06.21, 16:21
Контактная информация:

Re: Загрузка данных в две таблицы из одного view

Сообщение rugabarbo »

Ну хз, поизучать стэктрейс нужно тогда на странице с ошибкой. Может быть формам разные ID нужны? Я сейчас не помню, даёт ли Yii2 автоматом разные ID формам.
Ответить