Указать основной раздел всем элементам инфоблока

Была интересная задачка на работе: у клиента товары имели неверные хлебные крошки. Каждый элемент каталога был привязан к нескольким разделам и при открытии детальной страницы в путь крошек попадал высокий раздел, что неверно. Выход из ситуации простой — указать главный раздел. Соответственно, нужно поставить галочку в настройках, что мы хотим этот самый основной раздел использовать (надеюсь, не надо учить как поставить галочку? 🙂 ) Далее можно потыкать вручную через админку, указывая основной раздел для всех элементов, но это не наш метод 🙂

Мы пойдем другим, более интересным путем. Будем проходиться скриптом по всем товарам и задавать максимально глубокий раздел основным.

То есть, например, есть у нас товар Велосипед, который лежит в Велосипеды->Детям до 140см->Поддерживающие колеса. Если элемент привязан ко всем этим разделам, то путь на детальную страницу будет формироваться так, как будто товар лежит только в разделе Велосипеды. Ну а после работы скрипты основным разделом будет указан Поддерживающие колеса и ссылка (и крошки, соответственно) будут формироваться верные.

Код сприпта приведен ниже, пользуйтесь 🙂

<?php
require_once($_SERVER['DOCUMENT_ROOT']. "/bitrix/modules/main/include/prolog_before.php");
set_time_limit(1200);
if(CModule::IncludeModule('iblock')){	
$el = new CIBlockElement;
$Filter = array("IBLOCK_ID" => 21, "ACTIVE" => "Y");
$res = CIBlockElement::GetList(array("NAME"=>"ASC"), $Filter, false, false, array('ID', 'NAME'));

while($ob = $res->GetNext()){
/***************/

$ELEMENT_ID = $ob["ID"];
$db_old_groups = CIBlockElement::GetElementGroups($ELEMENT_ID, TRUE, array('ID', 'LEFT_MARGIN'));
$i = 0;
while($ar_group = $db_old_groups->Fetch()){
	
    $ar_new_groups[$i]['SECTION_ID'] = $ar_group["ID"];
    $ar_new_groups[$i]['LEFT_MARGIN'] = $ar_group["LEFT_MARGIN"];
    $i++;
}

$tmp = 0;
$tmp_arrSect = array();

$tmp_sect_id = '';
for($i=0; $i<count($ar_new_groups); $i++){
	
	$tmp_arrSect[] = $ar_new_groups[$i]['SECTION_ID'];
	
	if($tmp<$ar_new_groups[$i]['LEFT_MARGIN'] and $ar_new_groups[$i]['LEFT_MARGIN']!==362 and $ar_new_groups[$i]['LEFT_MARGIN']!==344) {
		$tmp = $ar_new_groups[$i]['LEFT_MARGIN'];
		$tmp_sect_id = $ar_new_groups[$i]['SECTION_ID'];
	}
}

$arLoadProductArray = Array(
'IBLOCK_SECTION_ID' =>$tmp_sect_id,
  "IBLOCK_SECTION" => $tmp_arrSect,
  );


$res2 = $el->Update($ELEMENT_ID, $arLoadProductArray);
echo '('.$ob['ID'].') '.$ob['NAME'].' | NEW SECT_ID: '.$tmp_sect_id.'<br>';
}
}