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

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

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

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

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

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

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<?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>';
}
}
<?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>'; } }
<?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>';
}
}