Была интересная задачка на работе: у клиента товары имели неверные хлебные крошки. Каждый элемент каталога был привязан к нескольким разделам и при открытии детальной страницы в путь крошек попадал высокий раздел, что неверно. Выход из ситуации простой — указать главный раздел. Соответственно, нужно поставить галочку в настройках, что мы хотим этот самый основной раздел использовать (надеюсь, не надо учить как поставить галочку? 🙂 ) Далее можно потыкать вручную через админку, указывая основной раздел для всех элементов, но это не наш метод 🙂
Мы пойдем другим, более интересным путем. Будем проходиться скриптом по всем товарам и задавать максимально глубокий раздел основным.
То есть, например, есть у нас товар Велосипед, который лежит в Велосипеды->Детям до 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>'; } }