mirror of
https://github.com/Vateron-Media/XC_VM.git
synced 2026-10-30 11:03:21 +01:00
2.5 KiB
2.5 KiB
Navbar rendering in module panel
Technical documentation for building and rendering the navbar in the admin panel.
Purpose
The navbar is built declaratively from a NavbarItem tree, not from hardcoded HTML menus.
Tree sources:
- Core nodes from
CoreNavbarProvider::register(). - Module nodes from
ModuleInterface::registerNavbar().
Lifecycle
ModuleLoader::bootAll()callsCoreNavbarProvider::register().- Then
registerNavbar()is called for each loaded module. - In
public/Views/admin/header.php, the tree is rendered fromNavbarRegistry.
Rendering in header
Rendering is done by helper functions:
_xc_nav_visible()- visibility filtering for a node._xc_nav_label()- text label resolution._xc_nav_children()- recursive rendering of child items.
Top-level nodes come from NavbarRegistry::getTopLevel(), child nodes come from NavbarRegistry::getChildren($key).
Visibility rules
Checks are performed in _xc_nav_visible():
desktopOnly: hides node on mobile.settingDisabled: hides node when a setting flag is enabled.permissions: OR-check viaAuthorization::check('adv', $permission).- A group with
url='#'is shown only if at least one child is visible. divideris always passed through and rendered as separator.
Rendering specifics
dividerrenders as separator without a link.submenuClass('megamenu')enables two-column rendering for long lists.noMobileSubmenudisables child submenu expansion on mobile.
How a module adds a menu item
A module adds items only through 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));
}
Practical rules for modules
- Use unique
keyvalues insection.group.itemformat. - Set
parentto an existing core tree node or your own already-added node. - Position items using
orderinside one parent. - Use
label('translation_key')for translatable text. - Use
label('', 'Literal Text')for fixed literal text. - If the module has no menu items, keep
registerNavbar()empty.