Своя сущность на HL-блоках

Урок 3 из 9

25 мин

Немного теории

Highload-блоки

Чем сложнее проект, тем больший контроль требуется за кешированием, структурой БД, SQL-запросами. Инфоблоки предоставляют обширные возможности (см. урок «Варианты реализации своих объектов»), но не всегда разработчик может изменить глубинную логику, заложенную в модуле.

В таком случае компромиссным вариантом между собственной таблицей в БД и Инфоблоками будут Highload-блоки. У них есть базовый веб-интерфейс, поддержка UF-полей, несколько простых компонентов. Все остальное отдано на откуп разработчику проекта под его ответственность.

Для эффективного использования Highload-блоков важно понимать, какие таблицы в БД они задействуют.

Таблица Назначение
Количество полей ИБ 1.0: Без ограничений
ИБ 2.0: 50
b_hlblock_entity Список Highload-блоков. Столбцы:
  • ID
  • Техническое название
  • Название таблицы БД
b_hlblock_entity_lang Языкозависимые названия сущностей Highload-блоков
b_hlblock_entity_rights Права доступа к Highload-блокам. Только простая ролевая модель: группа+доступ к сущности в целом
Собственная таблица Highload-блока вида <название сущности> Элементы Highload-блока. Столбцы:
  • ID
  • UF-поле 1
  • UF-поле 2
  • UF-поле N
Таблица для множественного UF-поля 1 вида <название сущности>_ <название поля> Значения множественного UF-поля 1. Столбцы:
  • ID элемента Highload-блока
  • Значение поля
Таблица для множественного UF-поля 2 вида <название сущности>_ <название поля> Значения множественного UF-поля 2. Столбцы:
  • ID элемента Highload-блока
  • Значение поля
Таблица для множественного UF-поля N вида <название сущности>_ <название поля> Значения множественного UF-поля N. Столбцы:
  • ID элемента Highload-блока
  • Значение поля

Таким образом, в отличие от Инфоблоков, элементы с одинарными полями хранятся в одной таблице и требуют меньшего количества SQL-запросов для CRUD-операций.

Изначально у Highload-блока нет других собственных колонок, кроме ID. Дополнительные колонки в таблицу напрямую добавлять запрещено, они создаются механизмом UF-полей. Для хранения одиночных UF-полей создаются колонки Highload-блока, для множественных — колонка в таблице для хранения полей в сериализованном виде и отдельная таблица.

Highload-блоки как справочник

Highload-блоки могут использоваться как связанный справочник в качестве хранилища значений для свойства элемента Инфоблока. Выглядит такое свойство в форме редактирования элемента как выпадающий список. При создании такого справочного Highload-блока у него сразу создаются UF-поля:

  • Название (UF_NAME)
  • Сортировка (UF_SORT)
  • Внешний код XML_ID (UF_XML_ID)
  • Изображение (UF_FILE)
  • Ссылка (UF_LINK)
  • Описание (UF_DESCRIPTION)
  • Полное описание (UF_FULL_DESCRIPTION)
  • По умолчанию (UF_DEF)

Экспорт/импорт HL-блоков

Для переноса данных между разными установками «1С-Битрикс: Управление сайтом» существует возможность экспорта данных Highload-блока в XML-файл и импорта из файла. В экспортируемом файле в собственном формате может быть представлена структура Highload-блока и данные. При импорте данные можно добавлять в уже существующий Highload-блок или создать новый на основе данных из файла. Подробнее об импорте и экспорте можно узнать в документации по платформе.

API

Для манипуляции с данными каждого Highload-блока необходим отдельный класс. Такие классы не требуется определять самому, их может сгенерировать ядро фреймворка с помощью метода \Bitrix\Highloadblock\HighloadBlockTable::compileEntity (подробнее в документации). Вся дальнейшая работа с Highload-блоками подчиняется законам ORM, поскольку созданная в модуле Highload-блоки сущность является ORM-сущностью. Это значит, что для манипуляции с данными доступны методы getList, add, update, delete.

Обработчики событий

Highload-блоки поддерживают механизм обработчиков событий. Но их объявление имеет особенности.

В первом аргументе \Bitrix\Main\EventManager::addEventHandler вы привыкли указывать модуль (main, iblock, form …), но для Highload-блоков модуль указывается как пустая строка.

Во втором аргументе нужно указать название события. У каждого Highload-блока 9 событий:

  • <название сущности>OnBeforeAdd
  • <название сущности>OnAdd
  • <название сущности>OnAfterAdd
  • <название сущности>OnBeforeUpdate
  • <название сущности>OnUpdate
  • <название сущности>OnAfterUpdate
  • <название сущности>OnBeforeDelete
  • <название сущности>OnDelete
  • <название сущности>OnAfterDelete

На вход обработчика передается объект класса \Bitrix\Main\Entity\Event, вернуть обработчик должен объект класса \Bitrix\Main\Entity\EventResult.

Компоненты

Модуль включает в себя два компонента: список записей сущностей (highloadblock.list) и детальный просмотр сущности (highloadblock.view) с одним шаблоном. Оба компонента проверяют права пользователя и работают без кэширования. Компонент списка умеет работать с постраничной навигацией, сортировкой и фильтрацией.

Практика

В качестве практического примера будем сохранять поисковые запросы пользователей в нашем личном кабинете, и количество результатов каждого из них. Также мы рассмотрим каким образом можно редактировать записи Highload-блока через инструменты экспорта и импорта.

Своя сущность на HL-блоках

16 мин