Немного теории
Highload-блоки
Чем сложнее проект, тем больший контроль требуется за кешированием, структурой БД, SQL-запросами. Инфоблоки предоставляют обширные возможности (см. урок «Варианты реализации своих объектов»), но не всегда разработчик может изменить глубинную логику, заложенную в модуле.
В таком случае компромиссным вариантом между собственной таблицей в БД и Инфоблоками будут Highload-блоки. У них есть базовый веб-интерфейс, поддержка UF-полей, несколько простых компонентов. Все остальное отдано на откуп разработчику проекта под его ответственность.
Для эффективного использования Highload-блоков важно понимать, какие таблицы в БД они задействуют.
Таблица | Назначение |
---|---|
Количество полей | ИБ 1.0: Без ограничений ИБ 2.0: 50 |
b_hlblock_entity | Список Highload-блоков. Столбцы:
|
b_hlblock_entity_lang | Языкозависимые названия сущностей Highload-блоков |
b_hlblock_entity_rights | Права доступа к Highload-блокам. Только простая ролевая модель: группа+доступ к сущности в целом |
Собственная таблица Highload-блока вида <название сущности> | Элементы Highload-блока. Столбцы:
|
Таблица для множественного UF-поля 1 вида <название сущности>_ <название поля> | Значения множественного UF-поля 1. Столбцы:
|
Таблица для множественного UF-поля 2 вида <название сущности>_ <название поля> | Значения множественного UF-поля 2. Столбцы:
|
… | … |
Таблица для множественного UF-поля N вида <название сущности>_ <название поля> | Значения множественного UF-поля N. Столбцы:
|
Таким образом, в отличие от Инфоблоков, элементы с одинарными полями хранятся в одной таблице и требуют меньшего количества 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 мин