-
Vadim TsukanovРазработчик
-
Дата публикации06.02.2022
-
Категория1С-Битрикс
Задача:Собрать и вывести разделы каталога в виде дерева
Каждого разработчика на битрикс бесит компонент catalog.section.list, все эти бордеры, марджины… Соберем массив с понятным деревом разделов на раз-два!
Итак, в основе мы все равно будем использовать компонент catalog.section.list, дабы дать пользователю возможность изменять настройки и получать различную глубину вложенности и т.д.
в result_modifier.php компонента собираем массив с подразделами
function __sectionSort($a, $b)
{
if ($a['SORT'] == $b['SORT']) {
return 0;
}
return ($a['SORT'] < $b['SORT']) ? -1 : 1;
}
if (!empty($arResult['SECTIONS'])) {
$rsSection = CIBlockSection::GetList(
array('DEPTH_LEVEL' => 'desc'),
$arFilter,
false,
array('ID', 'NAME', 'IBLOCK_SECTION_ID', 'DEPTH_LEVEL', 'SORT',"SECTION_PAGE_URL")
);
$arSectionList = array();
$arDepthLavel = array();
while($arSection = $rsSection->GetNext(true, false))
{
$arSectionList[$arSection['ID']] = $arSection;
$arDepthLavel[] = $arSection['DEPTH_LEVEL'];
}
$arDepthLavelResult = array_unique($arDepthLavel);
rsort($arDepthLavelResult);
$i_MaxDepthLevel = $arDepthLavelResult[0];
for( $i = $i_MaxDepthLevel; $i > 1; $i-- )
{
foreach ( $arSectionList as $i_SectionID => $ar_Value )
{
if( $ar_Value['DEPTH_LEVEL'] == $i )
{
$arSectionList[$ar_Value['IBLOCK_SECTION_ID']]['SUB_SECTION'][] = $ar_Value;
unset( $arSectionList[$i_SectionID] );
}
}
}
usort($arSectionList, "__sectionSort");
$arResult['arSectionList'] = $arSectionList;
}
Не трудно догадаться, куда мы сложили все данные…
Теперь выводим по необходимому шаблону, для этого декларируем метод
function recursivRenderMenu($arSectionList)
{
foreach ($arSectionList as $arSection)
{
if( count($arSection['SUB_SECTION']) > 0 )
{
echo '<li>';
echo '<a href="#" >'.$arSection['NAME'].'</a>';
echo '<button class="submenu-trigger"></button>';
echo '<ul>';
echo recursivRenderMenu($arSection['SUB_SECTION']);
echo '</ul>';
echo '</li>';
}
else
{
echo '<li>'.$arSection['NAME'].'</li>';
}
}
}
В месте, где нам необходима менюшка :
echo recursivRenderMenu($arResult['arSectionList']);
По сути — все, данный код экономит кучу нервов и времени!