Перейти к содержанию

Отображение навигационной панели на панели модуля

Техническая документация по созданию и рендерингу навигационной панели в админ-панели.

Цель

Навигационная панель создается декларативно из дерева NavbarItem, а не из жестко запрограммированных HTML-меню.

Древовидные источники:

  1. Основные узлы из CoreNavbarProvider::register().
  2. Узлы модуля из ModuleInterface::registerNavbar().

Жизненный цикл

  1. ModuleLoader::bootAll() вызывает CoreNavbarProvider::register().
  2. Затем для каждого загруженного модуля вызывается registerNavbar().
  3. В Public/Views/admin/header.php дерево отображается из NavbarRegistry.

Рендеринг в заголовке

Рендеринг выполняется вспомогательными функциями:

  1. _xc_nav_visible() - фильтрация видимости для узла.
  2. _xc_nav_label() - разрешение текстовой метки.
  3. _xc_nav_children() - рекурсивный рендеринг дочерних элементов.

Узлы верхнего уровня берутся из NavbarRegistry::getTopLevel(), дочерние узлы берутся из NavbarRegistry::getChildren($key).

Правила видимости

Проверки выполняются в _xc_nav_visible():

  1. desktopOnly: скрывает узел на мобильном устройстве.
  2. settingDisabled: скрывает узел, когда включен флаг настройки.
  3. permissions: ИЛИ-проверить с помощью Authorization::check('adv', $permission).
  4. Группа с url='#' отображается только в том случае, если виден хотя бы один дочерний элемент.
  5. divider всегда передается и отображается как разделитель.

Особенности рендеринга

  1. divider отображается как разделитель без ссылки.
  2. submenuClass('megamenu') включает отображение длинных списков в два столбца.
  3. noMobileSubmenu отключает расширение дочернего подменю на мобильном устройстве.

Как модуль добавляет элемент прейскуранта

Модуль добавляет элементы только через registerNavbar():

public function registerNavbar(NavbarRegistry $registry): 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));
}

API построителя навигационных элементов

NavbarItem — это объект с плавным значением (src/Core/Module/NavbarItem.php) - параметры цепочки отключены new NavbarItem($key):

Метод Цель
new NavbarItem($key) создайте узел; $key - это его уникальный идентификатор section.group.item
->parent($parentKey) присоединение к существующему узлу (опустить для узла верхнего уровня)
->url($url) целевой путь; '#' делает его не навигационным заголовком группа
->label($key, $fallback = '') клавиша перевода или ('', 'Literal') для фиксированного текста
->icon($icon) значок CSS-класса для элемента
->permissions([...]) ИЛИ - список разрешающих ключей; узел скрыт, если только у пользователя нет такого ключа
->order($n) позиция сортировки внутри родительского элемента
->desktopOnly() спрятаться на мобильном телефоне
->noMobileSubmenu() не открывайте подменю этого узла на мобильном устройстве
->submenuClass('megamenu') рендеринг в два столбца для длинных дочерних списков
->settingDisabled($settingKey) скройте узел, если этот флажок настройки панели соответствует действительности
->makeDivider() визуализируйте этот узел как разделитель (без ссылки)

Узел группы и разделитель

public function registerNavbar(NavbarRegistry $registry): void {
    // A group header (url('#')) — shown only if at least one child is visible
    NavbarRegistry::add((new NavbarItem('management.my_group'))
        ->parent('management')
        ->url('#')
        ->label('my_group')
        ->order(50));

    // A divider inside that group
    NavbarRegistry::add((new NavbarItem('management.my_group.sep1'))
        ->parent('management.my_group')
        ->makeDivider()
        ->order(55));
}

settingDisabled('some_setting') скрывает узел всякий раз, когда эта настройка верна (задает функцию за переключателем). Видимость также равна область просмотра: проверка permissions OR выполняется для текущего пользователя через Authorization::check('adv', …), поэтому администратор и реселлер могут видеть разные подмножества одного и того же дерева.

Практические правила для модулей

  1. Используйте уникальные значения key в формате section.group.item.
  2. Установите значение parent для существующего основного узла дерева или вашего собственного, уже добавленного узла.
  3. Расположите элементы, используя order, внутри одного родительского элемента.
  4. Используйте label('translation_key') для перевода текста.
  5. Используйте label('', 'Literal Text') для фиксированного буквального текста.
  6. Если в модуле нет пунктов меню, оставьте registerNavbar() пустым.

Связанные файлы

Файл Роль
src/Core/Module/NavbarRegistry.php Собирает элементы навигационной панели от поставщиков
src/Core/Module/NavbarItem.php Объект значения элемента навигационной панели
src/Core/Module/CoreNavbarProvider.php Встроенные основные пункты меню
src/Public/Views/admin/header.php Визуализирует дерево навигационной панели