Получение и обновление списка привязки элементов к разделам
Bitrix 17.0.14
Для получения в битриксе списка разделов привязанных к элементу используем функцию CIBlockElement::GetElementGroups.
Например, нам нужно сделать выборку элементов которые были созданы больше чем два месяца назад и удалить их из раздела новинок.
Делаем выборку и получаем id элементов в которых присутствует искомый раздел :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
$section_new = 111; // раздел "Новинки" $objDateTime = new \Bitrix\Main\Type\DateTime(); $objDateTime->add('-2 month'); $arSelect = Array("ID", "IBLOCK_ID", "PROPERTY_CATEG"); $arFilter = Array( "IBLOCK_ID"=>CATALOG_IBLOCK_ID, "ACTIVE"=>"Y", '>DATE_CREATE' => $objDateTime->format("Y-m-d"), 'SECTION_ID'=>[$section_new] ); $res = CIBlockElement::GetList(Array(), $arFilter, false, false, $arSelect); $arFields = []; $elIds = []; while($ob = $res->GetNextElement()){ $arFields = $ob->GetFields(); $elIds[] = $arFields['ID']; } |
В фильтре мы указываем ‘SECTION_ID’=>[$section_new] (делаем переменную массивом), т.к. значением фильтра может быть массив и в этом случае будут выбраны элементы привязанные хотя бы к одному из разделов указанных в фильтре. Если нам надо выбрать по «основному разделу», тогда фильтруем по параметру IBLOCK_SECTION_ID.
После выборки id элементов получаем список разделов для каждого из них функцией CIBlockElement::GetElementGroups и после добавляем обычной функцией Update в которой обновляем поле IBLOCK_SECTION передавая в него массив новых id разделов к которым будет привязка:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
// обновляем привязки к разделам if (!empty($elIds) && count($elIds) > 0) { // получаем список привязанных разделов $result = CIBlockElement::GetElementGroups($elIds, true, array('ID', 'IBLOCK_ELEMENT_ID')); $arElUpdSect = []; while($ar = $result->Fetch()) { $arElUpdSect[$ar['IBLOCK_ELEMENT_ID']][] = $ar['ID']; } $bs = new CIBlockElement; foreach ($elIds as $elId) { // находим и удаляем не нужный раздел в привязке if (count($arElUpdSect[$elId]) > 1 && ($key = array_search($section_new, $arElUpdSect[$elId]))) { unset($arElUpdSect[$elId][$key]); // обновляем список разделов у элемента $arUpdFields['IBLOCK_SECTION'] = $arElUpdSect[$elId]; $bs->Update($elId, $arUpdFields, 'N', true, true); } } } |