Поднимем ветку 10-летней давности :)
Может, кому пригодится.
Нарисовал простой алгоритм ("в лоб"), который из плоской структуры массива пунктов меню делает структуру многомерного массива, где подпункты меню вложены в элемент массива ["CHILD"] родительского пункта меню.
Поддерживает до 5 уровня вложенности (включительно). Кому нужно глубже - логику можно легко понять в скрипте.
Плоский массив формируется через вызов штатного компонента bitrix:menu.sections:[CODE]$APPLICATION->IncludeComponent("bitrix:menu.sections", "", array(
"IS_SEF" => "Y",
"SEF_BASE_URL" => "/catalog/",
"SECTION_PAGE_URL" => "#SECTION_CODE#/",
"DETAIL_PAGE_URL" => "#SECTION_CODE#/#ELEMENT_CODE#",
"IBLOCK_TYPE" => "catalog",
"IBLOCK_ID" => "1",
"DEPTH_LEVEL" => "5",
"CACHE_TYPE" => "A",
"CACHE_TIME" => "36000000"
),
false
);[/CODE]
Дальше в result_modifier.php шаблона пишем (полностью готовый result_modifier.php):[CODE]<?php if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED !== true) die();
/** @var array $arParams */
/** @var array $arResult */
/** @global \CMain $APPLICATION */
/** @global \CUser $USER */
/** @global \CDatabase $DB */
/** @var CBitrixComponentTemplate $this */
$arNewMenu = array();
foreach ($arResult as $key => $arItem) {
if ($arItem["DEPTH_LEVEL"] == 1) {
$arNewMenu[] = $arItem;
}
elseif ($arItem["DEPTH_LEVEL"] == 2) {
$arNewMenu[count($arNewMenu) - 1]["CHILD"][] = $arItem;
}
elseif ($arItem["DEPTH_LEVEL"] == 3) {
$child2_count = count($arNewMenu[count($arNewMenu) - 1]["CHILD"]);
$arNewMenu[count($arNewMenu) - 1]["CHILD"][$child2_count-1]['CHILD'][] = $arItem;
}
elseif ($arItem["DEPTH_LEVEL"] == 4) {
$child2_count = count($arNewMenu[count($arNewMenu) - 1]["CHILD"]);
$child3_count = count($arNewMenu[count($arNewMenu) - 1]["CHILD"][$child2_count-1]['CHILD']);
$arNewMenu[count($arNewMenu) - 1]["CHILD"][$child2_count-1]['CHILD'][$child3_count-1]['CHILD'][] = $arItem;
}
elseif ($arItem["DEPTH_LEVEL"] == 5) {
$child2_count = count($arNewMenu[count($arNewMenu) - 1]["CHILD"]);
$child3_count = count($arNewMenu[count($arNewMenu) - 1]["CHILD"][$child2_count-1]['CHILD']);
$child4_count = count($arNewMenu[count($arNewMenu) - 1]["CHILD"][$child2_count-1]['CHILD'][$child3_count-1]['CHILD']);
$arNewMenu[count($arNewMenu) - 1]["CHILD"][$child2_count-1]['CHILD'][$child3_count-1]['CHILD'][$child4_count-1]['CHILD'][] = $arItem;
}
}
$arResult = $arNewMenu;[/CODE]
В шаблоне уже получаем в $arResult следующей структуры:
Может, кому пригодится.
Нарисовал простой алгоритм ("в лоб"), который из плоской структуры массива пунктов меню делает структуру многомерного массива, где подпункты меню вложены в элемент массива ["CHILD"] родительского пункта меню.
Поддерживает до 5 уровня вложенности (включительно). Кому нужно глубже - логику можно легко понять в скрипте.
Плоский массив формируется через вызов штатного компонента bitrix:menu.sections:[CODE]$APPLICATION->IncludeComponent("bitrix:menu.sections", "", array(
"IS_SEF" => "Y",
"SEF_BASE_URL" => "/catalog/",
"SECTION_PAGE_URL" => "#SECTION_CODE#/",
"DETAIL_PAGE_URL" => "#SECTION_CODE#/#ELEMENT_CODE#",
"IBLOCK_TYPE" => "catalog",
"IBLOCK_ID" => "1",
"DEPTH_LEVEL" => "5",
"CACHE_TYPE" => "A",
"CACHE_TIME" => "36000000"
),
false
);[/CODE]
Дальше в result_modifier.php шаблона пишем (полностью готовый result_modifier.php):[CODE]<?php if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED !== true) die();
/** @var array $arParams */
/** @var array $arResult */
/** @global \CMain $APPLICATION */
/** @global \CUser $USER */
/** @global \CDatabase $DB */
/** @var CBitrixComponentTemplate $this */
$arNewMenu = array();
foreach ($arResult as $key => $arItem) {
if ($arItem["DEPTH_LEVEL"] == 1) {
$arNewMenu[] = $arItem;
}
elseif ($arItem["DEPTH_LEVEL"] == 2) {
$arNewMenu[count($arNewMenu) - 1]["CHILD"][] = $arItem;
}
elseif ($arItem["DEPTH_LEVEL"] == 3) {
$child2_count = count($arNewMenu[count($arNewMenu) - 1]["CHILD"]);
$arNewMenu[count($arNewMenu) - 1]["CHILD"][$child2_count-1]['CHILD'][] = $arItem;
}
elseif ($arItem["DEPTH_LEVEL"] == 4) {
$child2_count = count($arNewMenu[count($arNewMenu) - 1]["CHILD"]);
$child3_count = count($arNewMenu[count($arNewMenu) - 1]["CHILD"][$child2_count-1]['CHILD']);
$arNewMenu[count($arNewMenu) - 1]["CHILD"][$child2_count-1]['CHILD'][$child3_count-1]['CHILD'][] = $arItem;
}
elseif ($arItem["DEPTH_LEVEL"] == 5) {
$child2_count = count($arNewMenu[count($arNewMenu) - 1]["CHILD"]);
$child3_count = count($arNewMenu[count($arNewMenu) - 1]["CHILD"][$child2_count-1]['CHILD']);
$child4_count = count($arNewMenu[count($arNewMenu) - 1]["CHILD"][$child2_count-1]['CHILD'][$child3_count-1]['CHILD']);
$arNewMenu[count($arNewMenu) - 1]["CHILD"][$child2_count-1]['CHILD'][$child3_count-1]['CHILD'][$child4_count-1]['CHILD'][] = $arItem;
}
}
$arResult = $arNewMenu;[/CODE]
В шаблоне уже получаем в $arResult следующей структуры:
Скрытый текст |
|---|
| [CODE]Array ( [0] => Array ( [TEXT] => Интернет-магазин [LINK] => /catalog/internet-magazin/ [SELECTED] => [PERMISSION] => X [ADDITIONAL_LINKS] => Array ( [0] => /catalog/internet-magazin/ ) [ITEM_TYPE] => D [ITEM_INDEX] => 0 [PARAMS] => Array ( [FROM_IBLOCK] => 1 [IS_PARENT] => 1 [DEPTH_LEVEL] => 1 ) [DEPTH_LEVEL] => 1 [IS_PARENT] => 1 [CHILD] => Array ( [0] => Array ( [TEXT] => Все по 200 [LINK] => /catalog/vse-po-200/ [SELECTED] => [PERMISSION] => X [ADDITIONAL_LINKS] => Array ( [0] => /catalog/vse-po-200/ ) [ITEM_TYPE] => D [ITEM_INDEX] => 1 [PARAMS] => Array ( [FROM_IBLOCK] => 1 [IS_PARENT] => 1 [DEPTH_LEVEL] => 2 ) [DEPTH_LEVEL] => 2 [IS_PARENT] => 1 [CHILD] => Array ( [0] => Array ( [TEXT] => Тест 3 [LINK] => /catalog/test-3/ [SELECTED] => [PERMISSION] => X [ADDITIONAL_LINKS] => Array ( [0] => /catalog/test-3/ ) [ITEM_TYPE] => D [ITEM_INDEX] => 2 [PARAMS] => Array ( [FROM_IBLOCK] => 1 [IS_PARENT] => 1 [DEPTH_LEVEL] => 3 ) [DEPTH_LEVEL] => 3 [IS_PARENT] => 1 [CHILD] => Array ( [0] => Array ( [TEXT] => Тест 4 [LINK] => /catalog/test-4/ [SELECTED] => [PERMISSION] => X [ADDITIONAL_LINKS] => Array ( [0] => /catalog/test-4/ ) [ITEM_TYPE] => D [ITEM_INDEX] => 3 [PARAMS] => Array ( [FROM_IBLOCK] => 1 [IS_PARENT] => 1 [DEPTH_LEVEL] => 4 ) [DEPTH_LEVEL] => 4 [IS_PARENT] => 1 [CHILD] => Array ( [0] => Array ( [TEXT] => Тест 5 [LINK] => /catalog/test-5/ [SELECTED] => [PERMISSION] => X [ADDITIONAL_LINKS] => Array ( [0] => /catalog/test-5/ ) [ITEM_TYPE] => D [ITEM_INDEX] => 4 [PARAMS] => Array ( [FROM_IBLOCK] => 1 [IS_PARENT] => [DEPTH_LEVEL] => 5 ) [DEPTH_LEVEL] => 5 [IS_PARENT] => ) ) ) ) ) ) ) [1] => Array ( [TEXT] => Обувь [LINK] => /catalog/obuv/ [SELECTED] => [PERMISSION] => X [ADDITIONAL_LINKS] => Array ( [0] => /catalog/obuv/ ) [ITEM_TYPE] => D [ITEM_INDEX] => 5 [PARAMS] => Array ( [FROM_IBLOCK] => 1 [IS_PARENT] => [DEPTH_LEVEL] => 2 ) [DEPTH_LEVEL] => 2 [IS_PARENT] => ) [2] => Array ( [TEXT] => Сумки, зонты [LINK] => /catalog/sumki-zonty/ [SELECTED] => [PERMISSION] => X [ADDITIONAL_LINKS] => Array ( [0] => /catalog/sumki-zonty/ ) [ITEM_TYPE] => D [ITEM_INDEX] => 6 [PARAMS] => Array ( [FROM_IBLOCK] => 1 [IS_PARENT] => [DEPTH_LEVEL] => 2 ) [DEPTH_LEVEL] => 2 [IS_PARENT] => ) [3] => Array ( [TEXT] => Трикотаж женский [LINK] => /catalog/trikotazh-zhenskiy/ [SELECTED] => [PERMISSION] => X [ADDITIONAL_LINKS] => Array ( [0] => /catalog/trikotazh-zhenskiy/ ) [ITEM_TYPE] => D [ITEM_INDEX] => 7 [PARAMS] => Array ( [FROM_IBLOCK] => 1 [IS_PARENT] => 1 [DEPTH_LEVEL] => 2 ) [DEPTH_LEVEL] => 2 [IS_PARENT] => 1 [CHILD] => Array ( [0] => Array ( [TEXT] => Ночные комплекты/Пеньюары [LINK] => /catalog/nochnye-komplekty-penyuary/ [SELECTED] => [PERMISSION] => X [ADDITIONAL_LINKS] => Array ( [0] => /catalog/nochnye-komplekty-penyuary/ ) [ITEM_TYPE] => D [ITEM_INDEX] => 8 [PARAMS] => Array ( [FROM_IBLOCK] => 1 [IS_PARENT] => [DEPTH_LEVEL] => 3 ) [DEPTH_LEVEL] => 3 [IS_PARENT] => ) [1] => Array ( [TEXT] => Толстовки, кардиганы [LINK] => /catalog/tolstovki-kardigany/ [SELECTED] => [PERMISSION] => X [ADDITIONAL_LINKS] => Array ( [0] => /catalog/tolstovki-kardigany/ ) [ITEM_TYPE] => D [ITEM_INDEX] => 9 [PARAMS] => Array ( [FROM_IBLOCK] => 1 [IS_PARENT] => [DEPTH_LEVEL] => 3 ) [DEPTH_LEVEL] => 3 [IS_PARENT] => ) [2] => Array ( [TEXT] => Ситец, бязь, фланель [LINK] => /catalog/sitets-byaz-flanel/ [SELECTED] => [PERMISSION] => X [ADDITIONAL_LINKS] => Array ( [0] => /catalog/sitets-byaz-flanel/ ) [ITEM_TYPE] => D [ITEM_INDEX] => 10 [PARAMS] => Array ( [FROM_IBLOCK] => 1 [IS_PARENT] => [DEPTH_LEVEL] => 3 ) [DEPTH_LEVEL] => 3 [IS_PARENT] => ) ) ) ) ) ) [/CODE] |