Создать комплект в битриксе методом CCatalogProductSet::add , передаешь массив полей в метод add и комплект формируется (пример позаимствован с просторов сети)
Но когда сталкиваешься с методом CCatalogProductSet::update все оказывается сложнее, особенно учитывая что нет документации.
Метод принимает два параметра CCatalogProductSet::update($intID, $arFields) и вроде бы все просто, в первом передаем айди комплекта, а во втором массив полей. Но суть в том что айди комплекта это не айди элемента в инфоблоке (тот, что мы передаем в параметре "ITEM_ID"), а свой отдельный айди.
Получить его можно с помощью метода CCatalogProductSet::getAllSetsByProduct
и уже потом вы можете обновить комплект товаров с помощью CCatalogProductSet::update (и выполнить recalculateSetsByProduct , как советуют в другой статье )
Мне потребовалось несколько часов чтобы разобраться почему не обновляется комплект. И вот как только я решил написать в ТП, вдруг снизошло озарение.
Надеюсь кому-то поможет и сэкономит время. )
// Массив для создания комплекта $arFields = array( "TYPE" => 1, //тип 1 - комплект, 2 - набор // "SET_ID" => 0, //указывает на то что набор добавляется к этому товару "ITEM_ID" => 1234, // ID товара "ITEMS" => array( [0] => array( "ACTIVE" => "Y", // активность записи "ITEM_ID" => 34, // ID товара который добавляется в комплект "QUANTITY" => 1 // количество товара ), [1] => array( "ACTIVE" => "Y", "ITEM_ID" => 56, "QUANTITY" => 1 ), ) ); |
Но когда сталкиваешься с методом CCatalogProductSet::update все оказывается сложнее, особенно учитывая что нет документации.
Метод принимает два параметра CCatalogProductSet::update($intID, $arFields) и вроде бы все просто, в первом передаем айди комплекта, а во втором массив полей. Но суть в том что айди комплекта это не айди элемента в инфоблоке (тот, что мы передаем в параметре "ITEM_ID"), а свой отдельный айди.
Получить его можно с помощью метода CCatalogProductSet::getAllSetsByProduct
$arSetsByProduct = CCatalogProductSet::getAllSetsByProduct($origId, CCatalogProductSet::TYPE_SET); $arSetsByProduct = array_shift($arSetsByProduct); // комплект данного товара, тк getAllSetsByProduct возвращает массив |
и уже потом вы можете обновить комплект товаров с помощью CCatalogProductSet::update (и выполнить recalculateSetsByProduct , как советуют в другой статье )
if(CCatalogProductSet::update($arSetsByProduct['SET_ID'], $arFields)) CCatalogProductSet::recalculateSetsByProduct($origId); else $error = true; |
Мне потребовалось несколько часов чтобы разобраться почему не обновляется комплект. И вот как только я решил написать в ТП, вдруг снизошло озарение.
Надеюсь кому-то поможет и сэкономит время. )