Тип товара "Комплект" давно выпущен битриксом, но я до сих пор не встречал ни одной реализации.
Теперь попробовал сам, вкратце расскажу как их готовить и с чем есть.
Тип "Комплект" в разных частях имеет разный номер, т.ч. лучше пользоваться константами из соответствующего модуля
Создание комплекта
Добавить один товар-комплект в качестве составной части другого товара-комплекта нельзя. Система вернет ошибку.
Сразу после создания \ обновления комплекта
После создания комплекта в админке автоматически запускается функция, которая получает доступный остаток по каждому товару из комплекта, целочисленно делит его на количество товара в комплекте и, на основании этих данных, рассчитывает доступное количество всего комплекта.
При создании комплекта программно ее нужно вызвать отдельно:
Внимание: обновляется только общее "доступное количество", остатки по складам не проверяются и не сохраняются в соответствующие поля товара-комплекта.
Цена комплекта
У товара, к которому привязан "комплект" указана собственная цена, по которой он и проходит в каталоге. Эта цена не связана никакими обработчиками с ценами составных частей комплекта. Задается вручную.
Получение комплекта
Эта функция возвращает $arSets - массив "комплектов" для данного товара. Это именно массив, а не один комплект, хотя в админке нет возможности добавить несколько комплектов для одного товара.
$arSet - массив, описывающий комплект данного товара. Например такой:
Добавление в корзину комплекта
При добавлении комплекта в корзину (CSaleBasket::Add) происходит следующее:
Изменение товара-комплекта в корзине
При изменении количества товара-комплекта в корзине автоматически обновляются количества в корзине всех его составных частей. Никаких специальных обработчиков вешать не надо.
Компонент корзины
Стандартный компонент корзины (bitrix:sale.basket.basket) в списке товаров корзины отобразит только те записи, в которых SET_PARENT_ID == false, то есть он не отображает товары, являющиеся составом комплекта. Их для отображения нужно дополучить отдельно.
Оформление заказа с комплектом, выгрузка заказа
При оформлении заказа все записи из корзины (CSaleBasket) попадают в заказ - и комплект, и все его составные части.
Но на итоговую стоимость влияет только цена комплекта.
В админке в карточке заказа комплект отображен удобным образом.
При выгрузке заказа в списке его товаров выгружается как комплект с указанной ценой, так и все его составные части.
Теперь попробовал сам, вкратце расскажу как их готовить и с чем есть.
Тип "Комплект" в разных частях имеет разный номер, т.ч. лучше пользоваться константами из соответствующего модуля
- CCatalogProduct::TYPE_SET => 2
- CSaleBasket::TYPE_SET => 1
- CCatalogProductSet::TYPE_SET => 1
- CCatalogProductSet::TYPE_GROUP => 2 // это "Набор"
Создание комплекта
- Сначала создается обычный элемент инфоблока "Товары" (CIblockElement) и товарный продукт (CCatalogProduct)
- Затем к созданному товару добавляется комплект (CCatalogProductSet)
$arSaveSet = array( 'TYPE' => 1, 'ITEM_ID' => $complectID, 'ACTIVE' => "Y", 'ITEMS' => array( // товаров в составе комплекта может быть сколько угодно, не только два как здесь array( 'ITEM_ID' => $arOne['ID'], 'QUANTITY' => $arOne['COUNT'], 'DISCOUNT_PERCENT' => $arOne['DISCOUNT_PERCENT'], 'SORT' => 100, ), array( 'ITEM_ID' => $arTwo['ID'], 'QUANTITY' => $arTwo['COUNT'], 'DISCOUNT_PERCENT' => $arTwo['DISCOUNT_PERCENT'], 'SORT' => 200, ), ) ); $setId = CCatalogProductSet::add($arSaveSet); // создание самого "комплекта" |
Сразу после создания \ обновления комплекта
После создания комплекта в админке автоматически запускается функция, которая получает доступный остаток по каждому товару из комплекта, целочисленно делит его на количество товара в комплекте и, на основании этих данных, рассчитывает доступное количество всего комплекта.
При создании комплекта программно ее нужно вызвать отдельно:
CCatalogProductSet::recalculateSetsByProduct($complectID); |
Цена комплекта
У товара, к которому привязан "комплект" указана собственная цена, по которой он и проходит в каталоге. Эта цена не связана никакими обработчиками с ценами составных частей комплекта. Задается вручную.
Получение комплекта
$arSets = CCatalogProductSet::getAllSetsByProduct($complectID, CCatalogProductSet::TYPE_SET); // массив комплектов данного товара $arSet = array_shift($arSets); // комплект данного товара |
$arSet - массив, описывающий комплект данного товара. Например такой:
Array ( [TYPE] => 1 // это и есть CCatalogProductSet::TYPE_SET [SET_ID] => 229 [ITEM_ID] => 209490 // ID товара, чей комплект здесь описан [ACTIVE] => Y [QUANTITY] => [MEASURE] => [DISCOUNT_PERCENT] => [SORT] => 100 [ITEMS] => Array // состав комплекта, список товаров в нем ( [230] => Array ( [ID] => 230 [ITEM_ID] => 144673 [SORT] => 100 [QUANTITY] => 1 [MEASURE] => 0 [DISCOUNT_PERCENT] => 0 ) [231] => Array ( [ID] => 231 [ITEM_ID] => 144675 [SORT] => 200 [QUANTITY] => 3 [MEASURE] => 0 [DISCOUNT_PERCENT] => 100 ) ) ) |
Добавление в корзину комплекта
При добавлении комплекта в корзину (CSaleBasket::Add) происходит следующее:
- Сам товар-комплект записывается как CSaleBasket с полем 'TYPE' = CSaleBasket::TYPE_SET. Имеем ID ново-добавленного элемента корзины.
- Автоматически получается состав комплекта и для каждого товара из состава вызывается CSaleBasket::Add с полем SET_PARENT_ID = <ID> записи корзины, полученного в п1. В поле 'PRICE' указана реальная цена каждой части комплекта, а не "цена внутри комплекта"
- Свойства, с которыми добавляется комплект в корзину, не транслируются на все его составные части
- Если, по каким-то причинам (м.б. кастомные обработчики), не все части комплекта были добавлены в корзину, то никакой ошибки возвращено не будет, что смогло добавиться, то и добавилось.
Изменение товара-комплекта в корзине
При изменении количества товара-комплекта в корзине автоматически обновляются количества в корзине всех его составных частей. Никаких специальных обработчиков вешать не надо.
Компонент корзины
Стандартный компонент корзины (bitrix:sale.basket.basket) в списке товаров корзины отобразит только те записи, в которых SET_PARENT_ID == false, то есть он не отображает товары, являющиеся составом комплекта. Их для отображения нужно дополучить отдельно.
Оформление заказа с комплектом, выгрузка заказа
При оформлении заказа все записи из корзины (CSaleBasket) попадают в заказ - и комплект, и все его составные части.
Но на итоговую стоимость влияет только цена комплекта.
В админке в карточке заказа комплект отображен удобным образом.
При выгрузке заказа в списке его товаров выгружается как комплект с указанной ценой, так и все его составные части.