Какая разница между IBLOCK_SECTION_ID и IBLOCK_SECTION в методе CIBlockElement::Add?
Битрикс привязать сразу к нескольким разделам при загрузке элементов
В своих скриптах очень часто возникает потребность привязать товар сразу к нескольким разделам. Как это сделать, и почему в API до сих пор нет актуального примера? Давайте разбираться.
Смотрим код:
$SECTION_ID = []; if ($arItem['SECTION'][0]) { foreach ($arItem['SECTION'] as $key => $section) { $res = CIBlockSection::GetList ( Array("ID" => "ASC"), Array("IBLOCK_ID" => $IBLOCK_ID, "ACTIVE" => "Y", "NAME" => trim($section)), false, Array('ID', 'NAME') ); if ($arItems = $res->GetNext()) { $SECTION_ID[] = $arItems['ID']; } } } $arLoadProductArray = Array( "IBLOCK_SECTION" => $SECTION_ID, "IBLOCK_ID" => $IBLOCK_ID, "PROPERTY_VALUES" => $PROP, "NAME" => $arItem['NAME'], "CODE" => $CODE, "ACTIVE" => "N", "DETAIL_TEXT" => $arItem['DESC'], "DETAIL_PICTURE" => CFile::MakeFileArray($arItem['PICTURE']) ); if($PRODUCT_ID = $el->Add($arLoadProductArray)) echo "New ID: ".$PRODUCT_ID; else echo "Error: ".$el->LAST_ERROR;
Как видите, пример отличается от документации. В ней используется IBLOCK_SECTION_ID – и привязка идет только к одному разделу, либо указываем false – и элемент попадает в корень.
Теперь же у нас массив из ID, а пустой массив будет тем самым корнем раздела. IBLOCK_SECTION – массив из ID, который нам и был нужен.
В данном скрипте мы собираем те самые айди разделов по имени, т.к. в скрипте загрузчике информация подтягивается из файла. А в файле она лежит в виде названий разделов.
Стоит также отметить важный момент по скрипту – разделы уже должны быть заведены в базе на сайте, иначе по имени не найдет. Хотя такой сценарий всегда можно улучшить и дописать создание нового раздела в таких случаях 🙂 .