Как сформировать структуру для товара в битрикс с большим количеством вариантов?
Дано:
Товары - очки, которые по сути являются конструкторами. Очки = оправа + левая линза + правая линза.
Помимо вариаций линз (Сфера * цилиндр * ось * тип * тонировка) есть еще межзрачковое расстояние.
Необходимо:
Придумать каким образом это хранить в архитектуре товаров в битриксе, чтобы корректно отображались очки и в админке (со всеми выбранными характеристиками) и не приходилось городить свои костыли поверх хранения товаров.
Дополнения:
Если хранить все торговыми предложениями, то получается для одного товара 1*10^15 вариантов, что собственно вообще не тот компот. Можно было бы чуть уменьшить вариатовность, если заранее забить все варианты линз и из них составить набор (который к сожалению доступен лишь в максимальной версии), но таким образом сокращаем всего на 3 порядка всю эту кашу.
Возник вариант не создавать сразу все варианты, а создавать нужный только при "положить в корзину", но что то этот вариант попахивает костыльностью.
Числовые параметры (сфера, цилиндр, ось и т.п.) можно ни где не хранить.
Тип и тонировку - свойствами ИБ, или HL блоками. Или элементами инфоблоков - не принципиально.
Результат выбора пользователя (очки), можно хранить в ИБ, или своей таблице.
Если это элемент ИБ, то создаёте элемент и по свойствам распихиваете все что выбрал пользователь.
Чтобы управлять ценами на получившийся товар, при добавлении в корзину указывайте свой PRODUCT_PROVIER_CLASS. Для этого его надо будет реализовать. ( стандартный класс для примера \Bitrix\Catalog\Product\CatalogProvider ).
На данный момент все свойства как раз и хранятся в HL.
Результат выбора пользователя (очки), можно хранить в ИБ, или своей таблице.
А как тогда мы положим товар в корзину не имея ProductID ? Или это как раз то, что я и предположил в вопросе (раздел дополнения) ? Т.е. для каждого заказа пользователя мы имеем совй элемент в инфоблоке. И таким образом, зная эту "уязвимость" можно загадить базу на ура.
В любой системе при добавлении товара вам надо было бы хранить данные которые описывают то что выбрал пользователь.
В принципе вы можете не создавать новый элемент ИБ и добавлять в корзину всегда один и тот же товар. То что выбрал пользователь надо будет записывать в свойства элемента корзины.
Говоря о свойствах элемента корзины я имел в виду
Bitrix\Sale\BasketItem - элемент корзины
$item->getPropertyCollection(); - Свойства товара в корзине, коллекция объектов Sale\BasketPropertyItem
Но при этом нужно учитывать, что указанный товар должен иметь простой тип. Разве что придется перехватить вызов добавления в корзину, но это мелочи. Спасибо.