mirror of
https://github.com/Vateron-Media/XC_VM.git
synced 2026-10-28 03:03:18 +01:00
Structure:
- Split development/ (20 files) into development/ (framework reference) and guides/ (how-to)
- Moved 13 how-to files into new guides/ category (auth, cli, error-handling, etc.)
- Moved navbar-rendering.md from system/ into development/
- Deleted empty system/README.md files
- Deleted documentation_gaps.md (all gaps resolved) and redundant info/update.md
Sidebar / navbar:
- Removed all emojis from _sidebar.md (EN + RU) — fixes tree hierarchy rendering
- Removed flag emojis from _navbar.md language switcher
- Removed duplicate entries from the old "System Documentation" section
- Renamed section headers: "Development" -> "Framework Reference" + "Developer Guides"
Content fixes (modules.md EN + RU):
- Updated "Class naming" section: now documents XcVm\Module\{Pascal} namespaces
(was "global PHP namespace — Until PHP namespaces are introduced")
- Updated main module class example to use namespace declaration + use statements
- Updated class naming in ModuleLoader description to FQN
- Replaced installCrontab() manual crontab instruction with getCronEntries() API
- Updated enable/disable section: added ModuleState enum table, updated config examples
- Fixed FAQ answer for disabling a module
Content fixes (bootstrap-contexts.md EN + RU):
- Replaced CONTEXT_* string constants with BootContext enum cases throughout
- Updated boot() signature: string $context -> BootContext $context
- Updated getContext() return type: ?string -> ?BootContext
New framework reference docs (EN + RU):
- docs/{en,ru}/development/event-system.md: EventDispatcher singleton bridge,
#[ListensTo] attribute, getEventSubscribers() array API, stoppable events,
built-in event catalog, custom event authoring, ListensTo attribute reference
- docs/{en,ru}/development/exception-hierarchy.md: full XcVmException tree,
container vs module subtrees, PSR-11 compliance notes, catch-by-subsystem examples
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()пустым.