Menu
Menu формирует и сразу выводит HTML меню, сохранённого в таблице options_menu.Поддерживает
- вывод корневых и вложенных пунктов
- выделение пунктов по ключу
- исключение корневых пунктов
- вывод ссылок, текстовых пунктов и иконок
- повторный вывод меню с уникальным HTML-идентификатором
- автоматическое преобразование старого формата меню
Быстрый старт
$menu = new Menu('1');
$menu->insertMenu();Первым параметром передаётся идентификатор меню.
insertMenu() не возвращает строку, а сразу выводит готовый HTML.
Выделение пунктов
Ключи выделенных пунктов передаются вторым параметром:
$menu = new Menu(
'1',
['developer']
);
$menu->insertMenu();Если поле key пункта содержит developer, к его классу добавляется selected.
Для выделения пункта по текущему шаблону можно использовать PageData:
$menu = new Menu(
'1',
[PageData::getTemplate()]
);
$menu->insertMenu();Исключение пунктов
Ключи исключаемых пунктов передаются третьим параметром:
$menu = new Menu(
'1',
[],
[
'profile',
'logout',
]
);
$menu->insertMenu();Исключение надёжно применяется к корневым пунктам. Для вложенных пунктов текущая реализация проверяет ключ родителя, поэтому отдельное исключение дочернего пункта может не сработать.
Активные пункты
Пункт выводится только тогда, когда его поле active содержит строку true.
Булево значение true не считается эквивалентным строке:
trueСкрытые пункты и их дочерние элементы в HTML не попадают.
Структура HTML
Корневой контейнер получает класс ws-menu и уникальный идентификатор:
<div class="ws-menu" id="ws-menu-1-1">
<div class="item selected">
<a href="/developer">Документация</a>
</div>
</div>Вложенные пункты помещаются в sub-menu:
<div class="sub-menu child-1">
<div class="item">
<a href="/developer/api">API</a>
</div>
</div>Если поле link заполнено, выводится ссылка. Иначе выводится p.
При наличии icon перед названием добавляется изображение:
<img src="/assets/images/icon.svg" alt="Документация">Повторный вывод
Один объект можно вывести несколько раз:
$menu = new Menu('1');
$menu->insertMenu();
$menu->insertMenu();Каждый вызов увеличивает счётчик в идентификаторе:
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.
$menu = new Menu(
'1',
['developer'],
['hidden-item']
);insertMenu(): void
Выводит сформированный HTML:
$menu->insertMenu();legacyToNew(array $array): array
Преобразует старую структуру с ключом parents в текущий плоский формат.
Конструктор вызывает преобразование автоматически. Вручную использовать этот метод обычно не требуется.
Важные замечания
- меню должно существовать до создания объекта
selectedиexceptionsсопоставляются с полемkey- пункт отображается только при
active: trueв строковом формате insertMenu()выводит HTML черезecho- значения
name,link,iconиclassпопадают в HTML без дополнительного экранирования - порядок вывода соответствует порядку элементов в сохранённом массиве