Menu
Menu формирует и выводит HTML-меню, созданное через административную панель.Поддерживает
- вывод корневых и вложенных пунктов
- выделение пунктов по ключу
- исключение корневых и вложенных пунктов
- вывод ссылок, текстовых пунктов и иконок
- повторный вывод меню с уникальным 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();Каждый корневой или вложенный пункт проверяется по собственному полю key.
Если исключён родительский пункт, его дочерние пункты также не попадают в HTML.
Активные пункты
Пункт выводится только тогда, когда его поле 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 = [])
Подготавливает указанное меню к выводу.
$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 без дополнительного экранирования - порядок вывода соответствует порядку элементов в сохранённом меню