Skip to content

Модуль меню. realweb.api.menu

Совместимость

realweb.api v.4, v.5, v.6

Описание

Модуль позволяет настроить любое количество типов меню (В хедере, в футере, меню каталога) любой вложенности.

Особенности модуля:

  • Неограниченное количество типов меню
  • Возможность добавления “колонок” - пункты меню группируются в “колонки” и выводятся именно в той колонке, в которой добавлены
Пример колонок

Пример колонок

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

Пример колонок

Пример модифицированного интерфейса

Пример колонокПример - karamelka.bitrix.dev.realweb.ru

Внедрение

При внедрении меню в задачу программиста входит:

  1. Программным способом (через миграцию) добавить необходимые типы меню
  2. Описать представление вывода пунктов меню согласно спецификации или шаблону.
  3. При необходимости изменить интерфейс меню согласно ТЗ

При получении пунктов меню программист получает всю структуру меню - рекурсивное дерево

Возможные доработки

  • Улучшение интерфейса модуля

События модуля

Модуль имеет ряд событий для гибкого управления без необходимости изменять ядро

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());
        }

Репозиторий

Репозиторий модуля