Appearance
Модуль меню. realweb.api.menu
Совместимость
realweb.api v.4, v.5, v.6
Описание
Модуль позволяет настроить любое количество типов меню (В хедере, в футере, меню каталога) любой вложенности.
Особенности модуля:
- Неограниченное количество типов меню
- Возможность добавления “колонок” - пункты меню группируются в “колонки” и выводятся именно в той колонке, в которой добавлены
Пример колонок

- Возможность сортировки пунктов меню
- Возможность добавления различных типов пункта меню. В коробке представлены следующие типы:
- Ссылка (Анкор + ссылка)
- Элемент инфоблока (Анкор + выбор элемента инфблока по фильтру - ссылка сформируется автоматически).
- Раздел инфоблока (Анкор + выбор раздела инфоблока по фильтру - ссылка сформируется автоматически)
- Возможность добавлять “свои” типы пунктов меню (от разработчика лишь требуется описать интерфейс пункта меню в админке и логику сохранения)
- Возможность изменить интерфейс любого типа пункта меню (добавить дополнительные параметры, настройки пункта меню под задачи сайта)
- Управление пунктами меню drug-and-drop
Пример интерфейса админки из коробки

Пример модифицированного интерфейса
Внедрение
При внедрении меню в задачу программиста входит:
- Программным способом (через миграцию) добавить необходимые типы меню
- Описать представление вывода пунктов меню согласно спецификации или шаблону.
- При необходимости изменить интерфейс меню согласно ТЗ
При получении пунктов меню программист получает всю структуру меню - рекурсивное дерево
Возможные доработки
- Улучшение интерфейса модуля
События модуля
Модуль имеет ряд событий для гибкого управления без необходимости изменять ядро
onBeforeTemplateLoad
onBeforeTemplateLoad - Перед загрузкой шаблона в админке. Позволяет подключить “свой” шаблон
В событие передается объект URL с http адресом шаблона (по какой урл находится шаблон)
php
public function load(\Realweb\Api\Model\Utils\Url &$obUrl)
{
$obUrl->setPath('/__admin/menu/');
}onSaveEntity
onSaveEntity - Перед сохранением пункта меню
В событие передается объект пункта меню
php
public function onSave(\Realweb\Api\Module\Menu\Model\Item\Entity &$obEntity)
{
...
}afterGetItemObjectCollection
afterGetItemObjectCollection - После получения пунктов меню из БД
В событие передается коллекция объектов пункта меню
php
public function afterGetItemObjectCollection(\Realweb\Api\Module\Menu\Model\Item\Collection $obCollection): void
{
...
}toJsonAdminItemCollection
toJsonAdminCollection - Перед отправкой представления пунктов меню в json формате в административный интерфейс (Необходимо для модификации интерфейса пунктов меню)
В событие передается коллекция объектов пункта меню и результирующий массив с данными
php
public function toJsonAdminCollection(\Realweb\Api\Module\Menu\Model\Item\Collection $obCollection, array &$arData): void
{
...
}toJsonItemCollection
toJsonItemCollection - Перед отправкой представления коллекции пунктов меню в json формате на frontend
В событие передается коллекция объектов пункта меню и пустой результирующий массив
php
public function toJson(\Realweb\Api\Module\Menu\Model\Item\Collection $obCollection, array &$arData): void
{
...
}toJsonColumnCollection
toJsonColumnCollection - Перед отправкой представления коллекции колонок меню в json формате на frontend
В событие передается коллекция объектов колонки меню и пустой результирующий массив
php
public function toJson(\Realweb\Api\Module\Menu\Model\Column\Collection $obCollection, array &$arData): void
{
...
}toJsonItem
toJsonItem - Перед отправкой представления объекта пункта меню в json формате на frontend
В событие передается объект пункта меню и пустой результирующий массив
php
public function toJson(\Realweb\Api\Module\Menu\Model\Item\Entity $obEntity, array &$arData): void
{
...
}toJsonColumn
toJsonColumn - Перед отправкой представления объекта колонки меню в json формате на frontend
В событие передается объект колонки меню и пустой результирующий массив
php
public function toJson(\Realweb\Api\Module\Menu\Model\Column\Entity $obColumn, array &$arData): void
{
...
}Практическое использование
Контроллер получения меню
php
namespace Realweb\Api\Module\Menu\Controller;
use Realweb\Api\Module\Menu;
/**
* Class \Realweb\Api\Module\Menu\Controller\HeaderController
*
*/
class HeaderController extends \Realweb\Api\Controller
{
public function get()
{
$arResult = array();
$obTypes = (new Menu\Controller\TypeController())
->getCollection();
if ($obHeaderTop = $obTypes->getByCode(Menu\Model\Type\Helper::HEADER_TOP)) {
$arResult =(new Menu\Controller\ItemController())
->setParam('id', $obHeaderTop->getId())
->getCollection()
->toJson();
}
return $arResult;
}
}Миграция для добавления типов
php
use Realweb\Api\Model\FileSystem;
use Realweb\Api\Module\Menu;
$obImagesDir = new FileSystem\Dir\PublicDir(DIRECTORY_SEPARATOR . implode(DIRECTORY_SEPARATOR, array(
'bitrix',
'images',
'realweb.api.menu',
'type',
)));
if (!$obImagesDir->isExist()) {
$obImagesDir->create();
}
$obTypesCollection = Menu\Model\Type\Database::getObjectCollection();
$arData = array(
array(
'NAME' => 'Меню в шапке',
'CODE' => 'HEADER_TOP',
'ACTIVE' => 1,
),
array(
'NAME' => 'Меню каталога',
'CODE' => 'HEADER_CATALOG',
'ACTIVE' => 1,
),
array(
'NAME' => 'Мобильное меню',
'CODE' => 'HEADER_MOBILE',
'ACTIVE' => 1,
),
array(
'NAME' => 'Меню в футере',
'CODE' => 'FOOTER',
'ACTIVE' => 1,
),
);
foreach ($arData as $arType) {
if (!($obType = $obTypesCollection->getByCode($arType['CODE']))) {
$obType = new Menu\Model\Type\Entity($arType);
$obType->save();
}
$obFile = new FileSystem\File(__DIR__ . DIRECTORY_SEPARATOR . 'ws_m_1645525737_realweb_api_menu' . DIRECTORY_SEPARATOR . $arType['CODE'] . '.png');
copy($obFile->getName(), $obImagesDir->getPath() . DIRECTORY_SEPARATOR . $obFile->getOriginalName());
}