Модули коробки
Highload-блоки
Рабочая справка по highload-блокам в коробочном Bitrix24: HighloadBlockTable, compileEntity, DataClass, пользовательские поля, getList, add, update и delete.
Highload-блок — удобная таблица с пользовательскими полями. В коде обычно сначала получают
описание HL-блока, компилируют сущность, получают DataClass и уже через него
работают с элементами.
Общее понимание
Highload-блоки часто используют для справочников, настроек и больших простых таблиц.
Что такое highload-блок
HL-блок хранит описание таблицы, а сами элементы лежат в отдельной таблице. Поля
элементов обычно являются пользовательскими полями и имеют коды вида
UF_NAME, UF_XML_ID, UF_SORT.
Подключение модуля
<?php
use Bitrix\Main\Loader;
Loader::includeModule('highloadblock'); <?php
use Bitrix\Main\Loader;
/**
* Подключает модуль highloadblock.
*/
function requireHighloadBlockModule(): void
{
if (!Loader::includeModule('highloadblock')) {
throw new \RuntimeException('Не удалось подключить модуль highloadblock');
}
}
requireHighloadBlockModule(); Когда использовать
- справочник значений;
- таблица настроек;
- данные для обмена с внешней системой;
- простая сущность без сложной логики инфоблока;
- хранилище промежуточных данных для скриптов.
Карта методов
| Метод | Что делает | Когда использовать |
|---|---|---|
HighloadBlockTable::getList() | Ищет HL-блоки. | Найти блок по имени таблицы или другим полям. |
HighloadBlockTable::getById() | Получает HL-блок по ID. | Когда ID блока уже известен. |
HighloadBlockTable::add() | Создаёт HL-блок. | Миграции и установка модуля. |
HighloadBlockTable::update() | Изменяет параметры HL-блока. | Переименование или служебное изменение. |
HighloadBlockTable::delete() | Удаляет HL-блок. | Удаление тестовых или модульных таблиц. |
HighloadBlockTable::compileEntity() | Компилирует ORM-сущность элементов. | Перед работой с элементами. |
HighloadBlockTable::compileEntityId() | Возвращает ENTITY_ID пользовательских полей. | Добавление и поиск UF-полей HL-блока. |
$data_class::getList() | Получает элементы HL-блока. | Справочники, настройки, отчёты. |
$data_class::add() | Добавляет элемент. | Заполнение справочника. |
$data_class::update() | Изменяет элемент. | Обновление значения справочника. |
$data_class::delete() | Удаляет элемент. | Удаление записи HL-блока. |
HighloadBlockTable
Через HighloadBlockTable работают с самим HL-блоком как с описанием таблицы.
Получить HL-блок по ID
<?php
use Bitrix\Main\Loader;
use Bitrix\Highloadblock\HighloadBlockTable;
Loader::includeModule('highloadblock');
/**
* Получает описание HL-блока по ID.
*/
function fetchHighloadBlockById(int $highload_block_id): array
{
if ($highload_block_id <= 0) {
return [];
}
$highload_block = HighloadBlockTable::getById($highload_block_id)->fetch();
return is_array($highload_block) ? $highload_block : [];
}
$highload_block = fetchHighloadBlockById($highload_block_id);
print_r($highload_block); Найти HL-блок по таблице
<?php
use Bitrix\Main\Loader;
use Bitrix\Highloadblock\HighloadBlockTable;
Loader::includeModule('highloadblock');
/**
* Получает HL-блок по имени таблицы.
*/
function fetchHighloadBlockByTableName(string $table_name): array
{
if ($table_name === '') {
return [];
}
$highload_block = HighloadBlockTable::getList([
'select' => [
'ID',
'NAME',
'TABLE_NAME',
],
'filter' => [
'=TABLE_NAME' => $table_name,
],
'limit' => 1,
])->fetch();
return is_array($highload_block) ? $highload_block : [];
}
$highload_block = fetchHighloadBlockByTableName('b_hlbd_colors');
print_r($highload_block); Создать HL-блок
<?php
use Bitrix\Main\Loader;
use Bitrix\Highloadblock\HighloadBlockTable;
Loader::includeModule('highloadblock');
/**
* Создаёт HL-блок.
*/
function addHighloadBlock(string $name, string $table_name): array
{
if ($name === '' || $table_name === '') {
return [
'is_success' => false,
'highload_block_id' => 0,
'error_messages' => ['Не заполнены имя или таблица'],
];
}
$result = HighloadBlockTable::add([
'NAME' => $name,
'TABLE_NAME' => $table_name,
]);
return [
'is_success' => $result->isSuccess(),
'highload_block_id' => (int) $result->getId(),
'error_messages' => $result->getErrorMessages(),
];
}
$result = addHighloadBlock('Colors', 'b_hlbd_colors');
print_r($result); Изменить HL-блок
<?php
use Bitrix\Highloadblock\HighloadBlockTable;
/**
* Изменяет имя HL-блока.
*/
function updateHighloadBlockName(int $highload_block_id, string $name): array
{
if ($highload_block_id <= 0 || $name === '') {
return [
'is_success' => false,
'error_messages' => ['Не заполнены данные'],
];
}
$result = HighloadBlockTable::update($highload_block_id, [
'NAME' => $name,
]);
return [
'is_success' => $result->isSuccess(),
'error_messages' => $result->getErrorMessages(),
];
}
$result = updateHighloadBlockName($highload_block_id, 'Colors');
print_r($result); Удалить HL-блок
<?php
use Bitrix\Highloadblock\HighloadBlockTable;
/**
* Удаляет HL-блок.
*/
function deleteHighloadBlock(int $highload_block_id): array
{
if ($highload_block_id <= 0) {
return [
'is_success' => false,
'error_messages' => ['ID HL-блока не заполнен'],
];
}
$result = HighloadBlockTable::delete($highload_block_id);
return [
'is_success' => $result->isSuccess(),
'error_messages' => $result->getErrorMessages(),
];
}
$result = deleteHighloadBlock($highload_block_id);
print_r($result); DataClass и поля
Для работы с элементами нужен DataClass конкретного HL-блока.
compileEntity
<?php
use Bitrix\Highloadblock\HighloadBlockTable;
/**
* Компилирует сущность HL-блока.
*/
function compileHighloadBlockEntity(array $highload_block)
{
if (empty($highload_block)) {
return null;
}
return HighloadBlockTable::compileEntity($highload_block);
}
$entity = compileHighloadBlockEntity($highload_block); Получить DataClass
<?php
use Bitrix\Highloadblock\HighloadBlockTable;
/**
* Получает DataClass HL-блока.
*/
function fetchHighloadBlockDataClass(int $highload_block_id): string
{
$highload_block = fetchHighloadBlockById($highload_block_id);
if (empty($highload_block)) {
return '';
}
$entity = HighloadBlockTable::compileEntity($highload_block);
return $entity->getDataClass();
}
$data_class = fetchHighloadBlockDataClass($highload_block_id);
echo $data_class; ENTITY_ID пользовательских полей
<?php
use Bitrix\Highloadblock\HighloadBlockTable;
/**
* Получает ENTITY_ID пользовательских полей HL-блока.
*/
function fetchHighloadBlockUserFieldEntityId(int $highload_block_id): string
{
if ($highload_block_id <= 0) {
return '';
}
return HighloadBlockTable::compileEntityId($highload_block_id);
}
$entity_id = fetchHighloadBlockUserFieldEntityId($highload_block_id);
echo $entity_id; Добавить пользовательское поле
<?php
use Bitrix\Main\Loader;
use Bitrix\Highloadblock\HighloadBlockTable;
Loader::includeModule('highloadblock');
/**
* Добавляет строковое пользовательское поле к HL-блоку.
*/
function addHighloadBlockStringField(int $highload_block_id, string $field_name, string $label): int
{
if ($highload_block_id <= 0 || $field_name === '') {
return 0;
}
$entity_id = HighloadBlockTable::compileEntityId($highload_block_id);
$user_type_entity = new \CUserTypeEntity();
$field_id = $user_type_entity->Add([
'ENTITY_ID' => $entity_id,
'FIELD_NAME' => $field_name,
'USER_TYPE_ID' => 'string',
'XML_ID' => $field_name,
'SORT' => 100,
'MULTIPLE' => 'N',
'MANDATORY' => 'N',
'SHOW_FILTER' => 'I',
'SHOW_IN_LIST' => 'Y',
'EDIT_IN_LIST' => 'Y',
'IS_SEARCHABLE' => 'N',
'EDIT_FORM_LABEL' => [
'ru' => $label,
'en' => $label,
],
'LIST_COLUMN_LABEL' => [
'ru' => $label,
'en' => $label,
],
'LIST_FILTER_LABEL' => [
'ru' => $label,
'en' => $label,
],
]);
return (int) $field_id;
}
$field_id = addHighloadBlockStringField(
$highload_block_id,
'UF_COLOR_NAME',
'Название цвета'
);
echo $field_id; Элементы HL-блока
После получения DataClass элементы читаются и изменяются как обычная ORM-таблица.
Получить элементы
<?php
use Bitrix\Main\Loader;
Loader::includeModule('highloadblock');
const HIGHLOAD_BLOCK_LIMIT = 100;
/**
* Получает элементы HL-блока.
*/
function fetchHighloadBlockItems(int $highload_block_id, array $filter = []): array
{
$data_class = fetchHighloadBlockDataClass($highload_block_id);
if ($data_class === '') {
return [];
}
return $data_class::getList([
'select' => [
'ID',
'UF_NAME',
'UF_XML_ID',
],
'filter' => $filter,
'order' => [
'ID' => 'ASC',
],
'limit' => HIGHLOAD_BLOCK_LIMIT,
])->fetchAll();
}
$items = fetchHighloadBlockItems($highload_block_id, [
'=UF_ACTIVE' => 1,
]);
print_r($items); Добавить элемент
<?php
/**
* Добавляет элемент HL-блока.
*/
function addHighloadBlockItem(int $highload_block_id, array $item_fields): array
{
$data_class = fetchHighloadBlockDataClass($highload_block_id);
if ($data_class === '') {
return [
'is_success' => false,
'item_id' => 0,
'error_messages' => ['DataClass не найден'],
];
}
$result = $data_class::add($item_fields);
return [
'is_success' => $result->isSuccess(),
'item_id' => (int) $result->getId(),
'error_messages' => $result->getErrorMessages(),
];
}
$result = addHighloadBlockItem($highload_block_id, [
'UF_NAME' => $name,
'UF_XML_ID' => $xml_id,
]);
print_r($result); Изменить элемент
<?php
/**
* Изменяет элемент HL-блока.
*/
function updateHighloadBlockItem(int $highload_block_id, int $item_id, array $item_fields): array
{
$data_class = fetchHighloadBlockDataClass($highload_block_id);
if ($data_class === '') {
return [
'is_success' => false,
'error_messages' => ['DataClass не найден'],
];
}
if ($item_id <= 0) {
return [
'is_success' => false,
'error_messages' => ['ID элемента не заполнен'],
];
}
$result = $data_class::update($item_id, $item_fields);
return [
'is_success' => $result->isSuccess(),
'error_messages' => $result->getErrorMessages(),
];
}
$result = updateHighloadBlockItem($highload_block_id, $item_id, [
'UF_NAME' => $name,
]);
print_r($result); Удалить элемент
<?php
/**
* Удаляет элемент HL-блока.
*/
function deleteHighloadBlockItem(int $highload_block_id, int $item_id): array
{
$data_class = fetchHighloadBlockDataClass($highload_block_id);
if ($data_class === '') {
return [
'is_success' => false,
'error_messages' => ['DataClass не найден'],
];
}
if ($item_id <= 0) {
return [
'is_success' => false,
'error_messages' => ['ID элемента не заполнен'],
];
}
$result = $data_class::delete($item_id);
return [
'is_success' => $result->isSuccess(),
'error_messages' => $result->getErrorMessages(),
];
}
$result = deleteHighloadBlockItem($highload_block_id, $item_id);
print_r($result);