Laravel Eloquent как правильно организовать форму добавления товара со множеством атрибутов и опций?
Приветствую всех
Гуглю, гуглю уже много часов вместе со зрительным парсингом ютьюба. Не могу найти информацию как можно организовать достаточно сложную форму добавления и редактирования сущности "товар", которая имеет много разных реляций. Везде одни простейшие примеры с админкой аля Voyager и формой для одной таблицы в которую впиханы все атрибуты товара вместе с изображениями. 1 раз видел с опциями (просто еще одна табличка с фиксированными атрибутами в виде колонок таблицы color, price итд)
Возник ступор. Опыта очень мало, но стараюсь делать максимально правильно, пускай даже медленно и использовать фичи ларавела, а не серверные переменные $_POST вместо передачи Request. =) чтоб было понятно о чем я.
Есть стандартная модель БД EAV (некоторые колонки удалены для приятного восприятия):
Далее группы товаров (тоже самое что и тип товаров во многих ЦМС или просто группы характеристик привязанных к товару) Один атрибут может быть во многих группах
Groups (id, name) // id = 1; name = кольца
group_attributes (attribute_id, group_id)
Опции уже тут не буду расписывать, там еще 2 таблицы с одной pivot
В общем по идее ничего лишнего, но как это все одновременно добавлять нажав на кнопку сохранить не представляю. Ведь много зависимостей, например не знаем какие будут атрибуты у товара не выбрав пачку атрибутов или привязав группу к товару, по другому. Пускай группы можно добавить заранее. Смену группы в товаре делать не желательно, ибо тогда надо затирать все характеристики, группа сменится и значения вылетевших характеристик останутся (при update) при добавлении в принципе пофиг на это. И куча такого рода нюансов. я все их опишу, но по идее должен быть мб какой-то центр управления такой формой, или все пихать в метод контроллера
Есть модели Attribute, Product, Group. Не знаю как сделать правильно все это. Может есть у кого пример таких форм. Да и еще не знаю стоит ли всю форму отправлять в один роут контроллера, или может надо как-то перераспределить задачи (атомарность и все такое). Реляции на все есть. Может какой-то интерфейс надо писать на такое.
но как это все одновременно добавлять нажав на кнопку сохранить не представляю. Ведь много зависимостей, например не знаем какие будут атрибуты у товара не выбрав пачку атрибутов или привязав группу к товару, по другому
Что то не улавливается проблема. Попробуйте добавить более последовательный пример с расписанными действиями и моментом, когда у вас возникает сложность.
Попробую приблизительно разобраться. Есть у нас товары их атрибуты и группы атрибутов.
Значит у нас должна быть
- форма для создания групп атрибутов (просто создается именованная группа в которую можно поместить атрибут,
- форма для создания атрибутов (где мы можем добавить атрибут и выбрать для него группу из существующих)
- и форма для добавления товаров (где мы можем выбрать атрибуты из существующих)
Вроде никаких проблем. Если требуется иметь возможность создать новый атрибут из формы добавления продукта, то это делается AJAXом. Есть кнопка "создать новый атрибут" которая, например, открывает в модалке форму создания атрибута.
Соответственно контроллер создания продукта отвечает только за создание продукта, атрибуты уже должны быть все созданы.
PS
Кстати, если вы подобное видели в каких то CSM, то будет полезно разобраться как это решено было там.
Да так упрощенно и получается, только добавляя доп. логику, например группа характеристик, опции, изображения, СЕО итд, все в 1 форму =)
То есть, будет нормально какой-нить лапшевидный код только в 1 Action controller'a для сохранения данних из формы 4-6 моделей? Не сарказм, просто спрашиваю. Ведь по факту вся эта форма очень большая, из многих вкладок, загружается в одном методе контроллера.
Нет примера кода солидного проекта ? +) просто посмотреть как там все устроено, как лучше организовать код для получения или сохранения данных в одном методе контроллера, может использовать для этого какие-либо dataProvider Как в Yii или Интерфейсы, например ProductEditInterface, где будет тучка методов работающих с данными из нескольких моделей. Или нужно абсолютно всю логику реализовать только в модели сущности которую редактируем.
То есть, будет нормально какой-нить лапшевидный код только в 1 Action controller'a для сохранения данних из формы 4-6 моделей?
Почему в одном? Новые сущности создаются AJAXом, они уже существуют перед отправкой формы продукта, а при сохранении продукта в контроллер попадают только id связанных сущностей.
Нет примера кода солидного проекта ?
Поищите на гитхабе. Там ведь есть открытые коды CMS на Laravel в т.ч. и магазинных.