Матвей Земсков

Заметки веб-мастера

Вторник, 21 января 2020 20:42

Создание HL-блока с помощью API Bitrix

Оцените материал
(251 голосов)

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.

Скачать пример скрипта из статьи

Прочитано 21015 раз
Мои услуги

Предлагаю следующие услуги:

  • Верстка шаблона сайта из дизайн-макета для CMS «1С-Битрикс Управление сайтом» и CMS “Joomla”
  • Создание форм различной сложности (обратная связь, анкеты и тп) для указанных CMS
  • Настройка и кастомизация компонентов и модулей для указанных CMS
  • Доработка модулей и компонентов для указанных CMS, добавление нестандартного функционала
  • Разработка лендингов (landing-pages)

По все вопросам обращайтесь через форму обратной связи

Скачать

Предлагаю вашему вниманию:

Наверх