Highload-блоки Битрикса. Теория, практика, API.

Highload-блоки Битрикса. Теория, практика, API.

Highload-блоки Битрикса. Теория, практика, API.

Все знают, что они есть, но мало кто ими пользуется. Для чего они нужны? Когда нужно включать их в проект? Какое API есть для работы с ними? Давайте разбираться!

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

Зачем они нужны?

Само название уже говорит нам, что данные инфоблоки нужны для того, чтобы выдерживать большую нагрузку. Чтобы хранить в себе большой объем данных, с которыми вы сможете быстро и легко работать. Так оно и есть на самом деле.

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

Отличие простых инфоблоков от Highload

Самое главное отличие - это скорость работы. Это важно понимать. Если при работе с простыми инфоблоками система совершает много запросов к базе, чтобы сделать простую, казалось бы, выборку, то HL блокам достаточно одного SELECT'а. Ведь работа ведется лишь с одной таблицей. Тоже имейте это в виду, разрабатывая свой проект.

Привычного нам GetList'а с кучей параметров у хайлоад блоков нет, там все достаточно прозаично.

Когда нужно использовать Highload-блоки?

Сразу пример. Допустим, у вас есть некий развлекательный портал, на котором вы каждый день выкладываете разный прикольный\полезный\интересный контент. Люди, которые посещают ваш портал хотели бы иметь возможность сохранять понравившиеся им статьи, чтобы потом быстро их найти (допустим, в личном кабинете у них есть некий раздел с сохраненными постами).

Глупо было бы для этого создавать простой инфоблок с определенным набором свойств, где каждый новый элемент будет являться сохраненной статьей конкретного пользователя. Это просто не рационально и нецелесообразно.

Другое дело HL-блок. При его создании вы указываете лишь 2 пользовательских поля с типами "число" - USER_ID, ARTICLE_ID - и все! Дальнейшее сопоставление в личном кабинете будет очень простое. Делаем выборку всех ARTICLE_ID у пользователя с USER_ID, формируем массив и запихиваем его в $arFilter метода GetNext простых инфоблоков. Просто? Еще бы!

Ну, что ж, думаю, пора переходить к практике. Давайте разберемся, как же программно можно работать с HL-блоками: как делать выборку, как добавлять записи, как обновлять элементы и удалять их.

Работа с API

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

Для работы с API Highload блоками нам сначала необходимо подключить соответствующий модуль:

CModule::IncludeModule('highloadblock'); // подключаем модуль HL блоков

Далее, необходимо создать экземпляр сущности HL блока, с которым мы будем работать:

$hlblock_id = 1; // ID вашего Highload-блока
$hlblock   = Bitrix\Highloadblock\HighloadBlockTable::getById( $hlblock_id )->fetch(); // получаем объект вашего HL блока
$entity   = Bitrix\Highloadblock\HighloadBlockTable::compileEntity( $hlblock );  // получаем рабочую сущность
$entity_data_class = $entity->getDataClass(); // получаем экземпляр класса
$entity_table_name = $hlblock['TABLE_NAME']; // присваиваем переменной название HL таблицы
$sTableID = 'tbl_'.$entity_table_name; // добавляем префикс и окончательно формируем название

Теперь, чтобы добавить запись в хайлоад таблицу, необходимо выполнить метод add с массивом добавляемых значений;

$arData = Array(
				'UF_USER_ID' => 5,
				'UF_ARTICLE_ID' = > 123
			);
$result = $entity_data_class::add($arData);

if ($result->isSuccess()) {
  echo 'ID: ' . $result->getId() . "<br />";
} else {
  echo 'ERROR: ' . implode(', ', $result->getErrors()) . "<br />";
}

Несложно? Мы сформировали массив $arData с тем, что нам нужно добавить. В нашем случае, мы привяжем пользователю с ID=5 статью с ID=123.

А теперь давайте сделаем выборку со всеми возможными параметрами (чтобы вы знали, как все работает):

$arFilter = array("UF_USER_ID" => 5); // зададим фильтр по ID пользователя
$arSelect = array('*'); // выбираем все поля
$arOrder = array("UF_ARTICLE_ID"=>"ASC"); // сортировка будет по возрастанию ID статей

// подготавливаем данные
$rsData = $entity_data_class::getList(array(
	"select" => $arSelect,
	"filter" => $arFilter,
	"limit" => '5', //ограничим выборку пятью элементами
	"order" => $arOrder
));

// выполняем запрос. Передаем в него наши данные и название таблицы, которое мы получили в самом начале
$rsData = new CDBResult($rsData, $sTableID); // записываем в переменную объект CDBResult

// а далее простой цикл и знакомый нам метод Fetch (или GetNext, кому что нравится)
while($arRes = $rsData->Fetch()){
	print_r($arRes);
}

Чтобы удалить запись, достаточно воспользоваться методом delete, передав в него всего один параметр - ID элемента HL блока:

$entity_data_class::delete($arRes["ID"]);

Проще некуда! Осталось научиться обновлять элементы. Тут тоже все просто. Для этого существует метод update, который принимает два параметра - ID элемента HL блока и массив данных вида "пользовательское поле" => "значение для поля":

$arNewData = array('UF_ARTICLE_ID' => 321); // меняем значение поля с 123 на 321

$entity_data_class::update($arRes["ID"], $arNewData);

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