Menu


Menu формирует и сразу выводит HTML меню, сохранённого в таблице options_menu.

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

  • вывод корневых и вложенных пунктов
  • выделение пунктов по ключу
  • исключение корневых пунктов
  • вывод ссылок, текстовых пунктов и иконок
  • повторный вывод меню с уникальным 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();

Исключение надёжно применяется к корневым пунктам. Для вложенных пунктов текущая реализация проверяет ключ родителя, поэтому отдельное исключение дочернего пункта может не сработать.

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

Пункт выводится только тогда, когда его поле 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 = [])

Загружает меню и заранее формирует его HTML.

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 без дополнительного экранирования
  • порядок вывода соответствует порядку элементов в сохранённом массиве