Menu


Menu формирует и выводит HTML-меню, созданное через административную панель.

Поддерживает

  • вывод корневых и вложенных пунктов
  • выделение пунктов по ключу
  • исключение корневых и вложенных пунктов
  • вывод ссылок, текстовых пунктов и иконок
  • повторный вывод меню с уникальным HTML-идентификатором
  • автоматическое преобразование старого формата меню

Быстрый старт

php
$menu = new Menu('1');
$menu->insertMenu();

Первым параметром передаётся идентификатор меню.

insertMenu() не возвращает строку, а сразу выводит готовый HTML.

Выделение пунктов

Ключи выделенных пунктов передаются вторым параметром:

php
$menu = new Menu(
    '1',
    ['developer']
);

$menu->insertMenu();

Если поле key пункта содержит developer, к его классу добавляется selected.

Для выделения пункта по текущему шаблону можно использовать PageData:

php
$menu = new Menu(
    '1',
    [PageData::getTemplate()]
);

$menu->insertMenu();

Исключение пунктов

Ключи исключаемых пунктов передаются третьим параметром:

php
$menu = new Menu(
    '1',
    [],
    [
        'profile',
        'logout',
    ]
);

$menu->insertMenu();

Каждый корневой или вложенный пункт проверяется по собственному полю key.

Если исключён родительский пункт, его дочерние пункты также не попадают в HTML.

Активные пункты

Пункт выводится только тогда, когда его поле active содержит строку true.

Булево значение true не считается эквивалентным строке:

text
true

Скрытые пункты и их дочерние элементы в HTML не попадают.

Структура HTML

Корневой контейнер получает класс ws-menu и уникальный идентификатор:

html
<div class="ws-menu" id="ws-menu-1-1">
    <div class="item selected">
        <a href="/developer">Документация</a>
    </div>
</div>

Вложенные пункты помещаются в контейнер sub-menu:

html
<div class="sub-menu child-1">
    <div class="item">
        <a href="/developer/api">API</a>
    </div>
</div>

Если поле link заполнено, название выводится внутри ссылки. Иначе используется элемент p.

При наличии icon перед названием добавляется изображение:

html
<img src="/assets/images/icon.svg" alt="Документация">

Повторный вывод

Один объект можно вывести несколько раз:

php
$menu = new Menu('1');

$menu->insertMenu();
$menu->insertMenu();

Каждый вызов увеличивает счётчик в идентификаторе:

text
ws-menu-1-1
ws-menu-1-2

Поля пункта меню

Поле Описание
name Название пункта.
link Ссылка. Если пустая, используется элемент p.
icon URL изображения пункта.
class Дополнительный CSS-класс.
key Ключ для выделения и исключения.
active Строка true для отображения пункта.
parent Идентификатор родительского пункта.
order Сохранённое значение порядка пункта.

Публичный API

__construct(string $id, array $selected = [], array $exceptions = [])

Подготавливает указанное меню к выводу.

php
$menu = new Menu(
    '1',
    ['developer'],
    ['hidden-item']
);

insertMenu(): void

Выводит сформированный HTML:

php
$menu->insertMenu();

legacyToNew(array $array): array

Преобразует старую структуру меню с ключом parents в текущий плоский формат.

Конструктор выполняет преобразование автоматически. В новом коде вызывать метод вручную не требуется.

Важные замечания

  • меню должно существовать до создания объекта
  • значения selected и exceptions сопоставляются с полем key
  • пункт отображается только при строковом значении active: true
  • insertMenu() выводит HTML через echo
  • значения name, link, icon и class попадают в HTML без дополнительного экранирования
  • порядок вывода соответствует порядку элементов в сохранённом меню