Приведенный ниже код позволяет осуществить автоматическую привязку товаров каталога к определенной категории по значению (VALUE_ID) свойства товара.
В данном примере необходимо указать параметры:
$IBLOCK_ID – id инфблока с товарами;
$ACTION_PROMO_ATTR – id значения (VALUE_ID) атрибута, по которому ищутся товары;
$ACTION_SECTION – id категории к которой необходимо привязать товары.
// конфиг
$IBLOCK_ID = 2; // id инфблока с товарами
$ACTION_PROMO_ATTR = 325; // id значения (value_id) атрибута, по которому ищутся товары
$ACTION_SECTION = 172; // if категории, к которой нужно привязать товары
CModule::IncludeModule('iblock');
// при необходимости - очищаем категорию
/*
$arSelect = Array('ID', 'NAME');
$arFilter = Array('IBLOCK_ID' => $IBLOCK_ID, 'SECTION_ID' => $ACTION_SECTION);
$res = CIBlockElement::GetList(Array(), $arFilter, false, Array(), $arSelect);
*/
while ($ob = $res->GetNextElement()) {
$arElement = $ob->GetFields();
$groups = array();
$arGroups = CIBlockElement::GetElementGroups($arElement['ID'], true);
while ($group = $arGroups->Fetch()) {
if ($group['ID'] != $ACTION_SECTION) $groups[] = $group['ID'];
}
CIBlockElement::SetElementSection($arElement['ID'], $groups);
\Bitrix\Iblock\PropertyIndex\Manager::updateElementIndex($IBLOCK_ID, $arElement['ID']);
}
// добавляем товары в категорию
$arSelect = Array('ID', 'NAME');
$arFilter = Array('IBLOCK_ID' => $IBLOCK_ID, 'PROPERTY_PROMO' => $ACTION_PROMO_ATTR);
$res = CIBlockElement::GetList(Array(), $arFilter, false, Array(), $arSelect);
while ($ob = $res->GetNextElement()) {
$arElement = $ob->GetFields();
$groups = array();
$arGroups = CIBlockElement::GetElementGroups($arElement['ID'], true);
while ($group = $arGroups->Fetch()) {
$groups[] = $group['ID'];
}
if (!in_array($ACTION_SECTION, $groups)) $groups[] = $ACTION_SECTION;
CIBlockElement::SetElementSection($arElement['ID'], $groups);
\Bitrix\Iblock\PropertyIndex\Manager::updateElementIndex($IBLOCK_ID, $arElement['ID']);
}