Last active
February 27, 2023 19:49
-
-
Save Edarlingen/022ec3f511f7dcfcea3c3a84e1feb922 to your computer and use it in GitHub Desktop.
Рекурсивное построение меню сайта в NetCat
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/** | |
* Использование в макетах дизайна/врезках/компонентах: <?= buildMenu(); ?> | |
* Будет сформирован обычный маркированный список без классов, кроме классов с отображением состояния раздела у li. | |
* Внимательно читайте описание функций. Их необходимо разместить в файле /netcat/modules/default/function.inc.php | |
*/ | |
/** | |
* Функция для определения классов для указанного раздела | |
* @param int $given_sub - номер раздела | |
* @return array - массив с информацией о разделе | |
* Пояснения к возможным значениям ключей | |
* state => inactive - мы не находимся в текущем разделе | |
* state => active - мы находимся в текущем разделе, на странице просмотра списка объектов в инфоблоке | |
* state => active-link - мы находимся в текущем разделе на любой странице, кроме просмотра списка объектов в инфоблоке | |
* children => has-subs - в разделе есть подразделы | |
* children => no-subs - в разделе нет подразделов | |
*/ | |
function getClassesForSub($given_sub) { | |
global $nc_core; | |
global $parent_sub_tree; | |
global $sub; | |
global $action; | |
$classes = array( | |
'state' => 'inactive', | |
'children' => 'no-subs' | |
); | |
if (+$sub === +$given_sub) { | |
$classes['state'] = $action === 'index' ? 'active' : 'active-link'; | |
} else { | |
foreach ($parent_sub_tree as $sub_element) { | |
if (+$sub_element['Subdivision_ID'] === +$given_sub) { | |
$classes['state'] = 'active-link'; | |
break; | |
} | |
} | |
} | |
if (count($nc_core->nav->get_sub($given_sub)) > 0) { | |
$classes['children'] = 'has-subs'; | |
} | |
return $classes; | |
} | |
/** | |
* Функция для вывода сформированного html-меню для указанного раздела | |
* @param int $given_sub - раздел, с которого начинаем формировать меню. По умолчанию выводит меню начиная с корня сайта. | |
* @return string - html-строка с маркированным списком, хранящим дерево разделов | |
*/ | |
function buildMenu($given_sub = 0) { | |
global $nc_core; | |
$result = ''; | |
// получаем подразделы | |
$menu = $nc_core->nav->get_sub($given_sub); | |
if (count($menu) > 0) { | |
$result .= '<ul>'; | |
// Перебираем все подразделы | |
foreach ($menu as $menu_item) { | |
// Определяем классы для подраздела (активный, активная ссылка или неактивный | есть подразделы или нет подразделов) | |
$classes = implode(' ', getClassesForSub($menu_item->Subdivision_ID)); | |
$result .= "<li class='{$classes}'>"; | |
$result .= "<a href='{$menu_item->url}'>{$menu_item->name}</a>"; | |
// Все подразделы итерируемого раздела | |
$menu_sub = $nc_core->nav->get_sub($menu_item->Subdivision_ID); | |
// Если подразделы есть, входим в рекурсию | |
if (count($menu_sub) > 0) { | |
$result .= buildMenu($menu_item->Subdivision_ID); | |
} | |
$result .= '</li>'; | |
} | |
$result .= '</ul>'; | |
} | |
return $result; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment