mirror of
https://github.com/Vateron-Media/XC_VM.git
synced 2026-10-30 11:03:21 +01:00
3.6 KiB
3.6 KiB
Рендер navbar в панели модулей
Техническая документация по формированию и рендерингу navbar в админ-панели.
Назначение
Navbar строится декларативно из дерева NavbarItem, а не из hardcoded HTML-меню.
Источник дерева:
- Core-узлы из
CoreNavbarProvider::register(). - Модульные узлы из
ModuleInterface::registerNavbar().
Жизненный цикл
ModuleLoader::bootAll()вызываетCoreNavbarProvider::register().- Затем для каждого загруженного модуля вызывается
registerNavbar(). - В
public/Views/admin/header.phpдерево рендерится изNavbarRegistry.
Рендер в header
Рендер выполняется helper-функциями:
_xc_nav_visible()— фильтрация видимости узла._xc_nav_label()— получение текстовой подписи._xc_nav_children()— рекурсивный вывод дочерних пунктов.
Верхний уровень берётся через NavbarRegistry::getTopLevel(), дочерние узлы — через NavbarRegistry::getChildren($key).
Правила видимости
Проверки выполняются в _xc_nav_visible():
desktopOnly: скрывает узел на мобильных.settingDisabled: скрывает узел при включённом settings-флаге.permissions: OR-проверка черезAuthorization::check('adv', $permission).- Группа с
url='#'показывается только если есть хотя бы один видимый потомок. dividerвсегда пропускается в рендер как разделитель.
Особенности рендера
dividerвыводится как разделитель без ссылки.submenuClass('megamenu')включает двухколоночный вывод длинных списков.noMobileSubmenuвыключает раскрытие дочернего меню на мобильных.
Как модулю добавить кнопку
Модуль добавляет пункты только через registerNavbar():
public function registerNavbar(): void {
NavbarRegistry::add((new NavbarItem('management.service_setup.my_module'))
->parent('management.service_setup')
->url('my_module')
->label('my_module')
->permissions(['my_module'])
->order(60));
NavbarRegistry::add((new NavbarItem('management.logs.my_module_log'))
->parent('management.logs')
->url('my_module_logs')
->label('', 'My Module Logs')
->permissions(['my_module'])
->order(170));
}
Практические правила для модулей
- Используйте уникальные
keyв форматеsection.group.item. - Указывайте существующий
parentиз core-дерева или своего уже добавленного узла. - Позиционируйте пункты через
orderвнутри одного parent. - Используйте
label('translation_key')для переводимых строк. - Используйте
label('', 'Literal Text')для фиксированного текста. - Если модуль не добавляет меню, оставляйте
registerNavbar()пустым.