Поднимем ветку 10-летней давности
Может, кому пригодится.
Нарисовал простой алгоритм ("в лоб"), который из плоской структуры массива пунктов меню делает структуру многомерного массива, где подпункты меню вложены в элемент массива ["CHILD"] родительского пункта меню.
Поддерживает до 5 уровня вложенности (включительно). Кому нужно глубже - логику можно легко понять в скрипте.
Плоский массив формируется через вызов штатного компонента bitrix:menu.sections:
Код |
---|
$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
); |
Дальше в result_modifier.php шаблона пишем (полностью готовый result_modifier.php):
Код |
---|
<?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; |
В шаблоне уже получаем в $arResult следующей структуры:
Скрытый текст |
---|
Код |
---|
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] =>
)
)
)
)
)
)
|
|