Highload-инфоблоки существуют в системе 1С-Битркс уже довольно давно. Поэтому в сети довольно много информации, описывающей методы работы с ними. Особенно это касается операций добавления, чтения, изменения и удаления (CRUD).
Недавно мне понадобилось написать скрипт для создания HL-инфоблока, но найти какую-то вразумительную информацию по этой теме, мне не удалось. О том, как я искал информацию и выполнял эту задачу я расскажу с этой заметке.
Я решил поискать как создаются Highload-блоки в административной панели. Если зайти в раздел Контент → Highload-блоки и нажать на кнопку Добавить Highload-блок, то мы увидим форму. В атрибуте action указан следующий адрес: /bitrix/admin/highloadblock_entity_edit.php.
Скрипты, размещенных в папке admin, осуществляют перенаправление на другие скрипты из папки /bitrix/modules/. В данном случае этим файлом является /bitrix/modules/highloadblock/admin/highloadblock_entity_edit.php. В этом скрипте обрабатываются случаи добавления и обновления HL-инфоблока.
На основе кода из этого файла я создал свой скрипт. В этой статье я опишу весь этот процесс по шагам. Получившийся код также будет рассмотрен. Задача, которую мне нужно был решить состояла в том, чтобы создать HL-инфоблок для хранения содержимого корзин посетителей сайта.
Итак, приступаем к разработке скрипта. Визуальная часть сайта нам не нужна, поэтому шаблон сайта не подключаем, а вот классы модуля Highload-блоки (highloadblock) нам необходимы. Мы подключим модуль в самом начале скрипта.
PHP
use Bitrix\Main\Loader;
Loader::IncludeModule('highloadblock');
use Bitrix\Highloadblock as HL;
Далее определимся с языковыми параметрами, а именно с названием HL-блока Битрикс. Создадим массив названий на русском и английском языке.
PHP
$arLangs = Array(
'ru' => 'Корзина посетителя',
'en' => 'Visitor Cart'
);
Как известно Highload-блоки хранятся отдельных таблицам БД Битрикса, создадим ее. Обращаю внимание, что название блока (аргумент NAME) должно начинаться с заглавной буквы и состоять только из латинских букв и цифр, а имя таблицы (аргумент TABLE_NAME) должно состоять только из строчных латинских букв, цифр и знака подчеркивания.
PHP
//создание HL-блока для корзин покупателей
$result = HL\HighloadBlockTable::add(array(
'NAME' => 'VisitorCart3',
'TABLE_NAME' => 'visitor_cart3',
));
Если все прошло успешно, сохраняем в переменной $id идентификатор созданного HL-блока Битрикс и сохраняем его языковые параметры, иначе получаем ошибки и выводим их функцией var_dump.
PHP
if ($result->isSuccess()) {
$id = $result->getId();
foreach($arLangs as $lang_key => $lang_val){
HL\HighloadBlockLangTable::add(array(
'ID' => $id,
'LID' => $lang_key,
'NAME' => $lang_val
));
}
} else {
$errors = $result->getErrorMessages();
var_dump($errors);
}
Далее переходим к созданию полей, которые по своей сути являются пользовательским свойствами. Они будут привязаны к HL-блоку: $UFObject = 'HLBLOCK_'.$id;.
Формируем массив полей с привязкой, созданной выше и хранящейся в переменной $UFObject.
PHP
$arCartFields = Array(
'UF_CART_ID'=>Array(
'ENTITY_ID' => $UFObject,
'FIELD_NAME' => 'UF_CART_ID',
'USER_TYPE_ID' => 'string',
'MANDATORY' => 'Y',
"EDIT_FORM_LABEL" => Array('ru'=>'ИД корзины', 'en'=>'Cart ID'),
"LIST_COLUMN_LABEL" => Array('ru'=>'ИД корзины', 'en'=>'Cart ID'),
"LIST_FILTER_LABEL" => Array('ru'=>'ИД корзины', 'en'=>'Cart ID'),
"ERROR_MESSAGE" => Array('ru'=>'', 'en'=>''),
"HELP_MESSAGE" => Array('ru'=>'', 'en'=>''),
),
'UF_ADDED'=>Array(
'ENTITY_ID' => $UFObject,
'FIELD_NAME' => 'UF_ADDED',
'USER_TYPE_ID' => 'string',
'MANDATORY' => 'Y',
"EDIT_FORM_LABEL" => Array('ru'=>'Дата добавления', 'en'=>'Date added'),
"LIST_COLUMN_LABEL" => Array('ru'=>'Дата добавления', 'en'=>'Date added'),
"LIST_FILTER_LABEL" => Array('ru'=>'Дата добавления', 'en'=>'Date added'),
"ERROR_MESSAGE" => Array('ru'=>'', 'en'=>''),
"HELP_MESSAGE" => Array('ru'=>'', 'en'=>''),
),
'UF_DISH_ID'=>Array(
'ENTITY_ID' => $UFObject,
'FIELD_NAME' => 'UF_DISH_ID',
'USER_TYPE_ID' => 'integer',
'MANDATORY' => 'Y',
"EDIT_FORM_LABEL" => Array('ru'=>'ИД Блюда', 'en'=>'Dish ID'),
"LIST_COLUMN_LABEL" => Array('ru'=>'ИД Блюда', 'en'=>'Dish ID'),
"LIST_FILTER_LABEL" => Array('ru'=>'ИД Блюда', 'en'=>'Dish ID'),
"ERROR_MESSAGE" => Array('ru'=>'', 'en'=>''),
"HELP_MESSAGE" => Array('ru'=>'', 'en'=>''),
),
'UF_DISH_NAME'=>Array(
'ENTITY_ID' => $UFObject,
'FIELD_NAME' => 'UF_DISH_NAME',
'USER_TYPE_ID' => 'string',
'MANDATORY' => 'Y',
"EDIT_FORM_LABEL" => Array('ru'=>'Название блюда', 'en'=>'Name of dish'),
"LIST_COLUMN_LABEL" => Array('ru'=>'Название блюда', 'en'=>'Name of dish'),
"LIST_FILTER_LABEL" => Array('ru'=>'Название блюда', 'en'=>'Name of dish'),
"ERROR_MESSAGE" => Array('ru'=>'', 'en'=>''),
"HELP_MESSAGE" => Array('ru'=>'', 'en'=>''),
),
'UF_DISH_QUANT'=>Array(
'ENTITY_ID' => $UFObject,
'FIELD_NAME' => 'UF_DISH_QUANT',
'USER_TYPE_ID' => 'integer',
'MANDATORY' => '',
"EDIT_FORM_LABEL" => Array('ru'=>'Количество', 'en'=>'Quantity'),
"LIST_COLUMN_LABEL" => Array('ru'=>'Количество', 'en'=>'Quantity'),
"LIST_FILTER_LABEL" => Array('ru'=>'Количество', 'en'=>'Quantity'),
"ERROR_MESSAGE" => Array('ru'=>'', 'en'=>''),
"HELP_MESSAGE" => Array('ru'=>'', 'en'=>''),
),
'UF_DISH_PRICE'=>Array(
'ENTITY_ID' => $UFObject,
'FIELD_NAME' => 'UF_DISH_PRICE',
'USER_TYPE_ID' => 'double',
'MANDATORY' => 'Y',
"EDIT_FORM_LABEL" => Array('ru'=>'Цена', 'en'=>'Price'),
"LIST_COLUMN_LABEL" => Array('ru'=>'Цена', 'en'=>'Price'),
"LIST_FILTER_LABEL" => Array('ru'=>'Цена', 'en'=>'Price'),
"ERROR_MESSAGE" => Array('ru'=>'', 'en'=>''),
"HELP_MESSAGE" => Array('ru'=>'', 'en'=>''),
),
);
Описание каждого поля в свою очередь также является массивом со следующими ключами:
- ENTITY_ID – Объект, к которому «привязано» поле
- FIELD_NAME – Код поля
- USER_TYPE_ID – Тип данных (например, адрес, да/нет и тп)
- MANDATORY – Отметка обязательности заполнения
- EDIT_FORM_LABEL – Подпись в форме редактирования
- LIST_COLUMN_LABEL – Заголовок в списке
- LIST_FILTER_LABEL – Подпись фильтра в списке
- ERROR_MESSAGE – Сообщение об ошибке (не обязательное)
- HELP_MESSAGE – Справочное сообщение
Ну вот практически все готово. Осталось только создать поля HL-блока.
PHP
$arSavedFieldsRes = Array();
foreach($arCartFields as $arCartField){
$obUserField = new CUserTypeEntity;
$ID = $obUserField->Add($arCartField);
$arSavedFieldsRes[] = $ID;
}
Если прошло без ошибок, то после выполнения кода у вас будет создан HL-блок с перечисленными выше полями. Чтобы увидеть идентификаторы созданных полей, можно вывести массив $arSavedFieldsRes функцией $dump().
Теперь после ознакомления со статьей вы сможете с легкостью создать HL-блок с помощью API Bitrix.
Скачать пример скрипта из статьи