Skip to content

Instantly share code, notes, and snippets.

@Edarlingen
Last active February 27, 2023 19:49
Show Gist options
  • Save Edarlingen/022ec3f511f7dcfcea3c3a84e1feb922 to your computer and use it in GitHub Desktop.
Save Edarlingen/022ec3f511f7dcfcea3c3a84e1feb922 to your computer and use it in GitHub Desktop.
Рекурсивное построение меню сайта в NetCat
<?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