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="Документация">Повторный вывод
Одно меню можно выводить несколько раз, используя один или разные объекты:
$firstMenu = new Menu('1');
$secondMenu = new Menu('1');
$firstMenu->insertMenu(); // id="ws-menu-1-1"
$secondMenu->insertMenu(); // id="ws-menu-1-2"
$firstMenu->insertMenu(); // id="ws-menu-1-3"В пределах одного запроса каждый вывод меню с одинаковым ID получает следующий номер. Создание нового объекта не начинает нумерацию заново.
Для другого ID меню нумерация начинается с 1.
Поля пункта меню
| Поле | Описание |
|---|---|
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 в текущий плоский формат.
Конструктор выполняет преобразование автоматически. В новом коде вызывать метод вручную не требуется.
Важные замечания
- если меню не найдено,
insertMenu()выводит пустой контейнерws-menuс уникальным идентификатором - значения
selectedиexceptionsсопоставляются с полемkey - для явно заданного
activeиспользуется строкаtrue; отсутствие поля также разрешает отображение пункта insertMenu()выводит HTML черезecho- значения
name,link,iconиclassпопадают в HTML без дополнительного экранирования - порядок вывода соответствует порядку элементов в сохранённом меню