mirror of
https://github.com/Vateron-Media/XC_VM.git
synced 2026-10-24 12:03:17 +02:00
Fix Markdown-mangling artifacts the free web engine (yandex) produced in the
committed docs/ru, and regenerate the whole tree cleanly (0 fallbacks):
- Sentinel format @@N@@ -> {N}. MT engines are trained to preserve curly
format-string placeholders, so {N} survives code-heavy lines where @@N@@ (and
ZZZ…ZZZ, which also duplicated its Z) were split/moved — e.g. the stray
"@0@@" in the FAQ and "load balancerZ" in the README are gone.
- Possessive: a trailing English `'s` is consumed INTO the masked span and
dropped on restore. Every sentinel format breaks when a bare `'s` sits right
after it, and Russian has no possessive `'s`.
- Validate + retry: after restore, any leftover brace fragment triggers a retry
(the engine is non-deterministic); after a few failures the line stays English
so a broken token is never emitted.
- Glossary += KeyDB, yt-dlp, Ubuntu, iptables, MAGSCAN.
Regenerated docs/ru (37 files, translators/yandex): no residual sentinels,
mkdocs build --strict clean.
4.7 KiB
4.7 KiB
Отображение навигационной панели на панели модуля
Техническая документация по созданию и рендерингу навигационной панели в админ-панели.
Цель
Навигационная панель создается декларативно из дерева NavbarItem, а не из жестко запрограммированных HTML-меню.
Древовидные источники:
- Основные узлы из
CoreNavbarProvider::register(). - Узлы модуля из
ModuleInterface::registerNavbar().
Жизненный цикл
ModuleLoader::bootAll()вызываетCoreNavbarProvider::register().- Затем для каждого загруженного модуля вызывается
registerNavbar(). - В
Public/Views/admin/header.phpдерево отображается изNavbarRegistry.
Рендеринг в заголовке
Рендеринг выполняется вспомогательными функциями:
_xc_nav_visible()- фильтрация видимости для узла._xc_nav_label()- разрешение текстовой метки._xc_nav_children()- рекурсивный рендеринг дочерних элементов.
Узлы верхнего уровня берутся из NavbarRegistry::getTopLevel(), дочерние узлы берутся из NavbarRegistry::getChildren($key).
Правила видимости
Проверки выполняются в _xc_nav_visible():
desktopOnly: скрывает узел на мобильном устройстве.settingDisabled: скрывает узел, когда включен флаг настройки.permissions: ИЛИ-проверить с помощью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для существующего основного узла дерева или вашего собственного, уже добавленного узла. - Расположите элементы, используя
order, внутри одного родительского элемента. - Используйте
label('translation_key')для перевода текста. - Используйте
label('', 'Literal Text')для фиксированного буквального текста. - Если в модуле нет пунктов меню, оставьте
registerNavbar()пустым.
Связанные файлы
| Файл | Роль |
|---|---|
src/Core/Module/NavbarRegistry.php |
Собирает элементы навигационной панели от поставщиков |
src/Core/Module/NavbarItem.php |
Объект значения элемента навигационной панели |
src/Core/Module/CoreNavbarProvider.php |
Встроенные основные пункты меню |
src/Public/Views/admin/header.php |
Визуализирует дерево навигационной панели |