Телеграм: @bazarow_ru mihail@bazarow.ru Проверяю почту и телеграм 2-3 раза в день.
С 1 по 10 января 2024 будет сделан редизайн сайта.
Пришла пора освежиться!

Получение списка Highload блоков с помощью API Битрикс

Просмотров: 178

1С-Битрикс предоставляет мощный инструментарий для обеспечения эффективной работы ваших проектов. Одним из способов управления Highload блоками в Битриксе является использование API, позволяющего вам получать и манипулировать информацией о блоках. В этой статье мы рассмотрим, как получить список всех Highload блоков с помощью API Битрикс.

Получение списка Highload блоков с помощью API Битрикс

Шаг 1: Подключение к модулю HighloadBlock

Перед тем как начать взаимодействие с Highload блоками, убедитесь, что вы находитесь в правильном контексте. Вам нужно будет подключить модуль highloadblock и убедиться, что он доступен для использования. Это можно сделать следующим образом:

require_once($_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/include/prolog_before.php');
CModule::IncludeModule('highloadblock');

Шаг 2: Получение списка Highload блоков

Для получения списка всех Highload блоков мы будем использовать метод getList() из класса Bitrix\Highloadblock\HighloadBlockTable. Этот метод возвращает итератор, который мы будем использовать для обхода и извлечения информации о блоках:


use Bitrix\Highloadblock as HL;

// Получаем список всех Highload блоков
$hlblockList = [];
$hlblockIterator = HL\HighloadBlockTable::getList();
while ($hlblock = $hlblockIterator->fetch()) {
    $hlblockList[] = $hlblock;
}

Шаг 3: Вывод информации о блоках

Для получения списка всех Highload блоков мы будем использовать метод getList() из класса Bitrix\Highloadblock\HighloadBlockTable. Этот метод возвращает итератор, который мы будем использовать для обхода и Теперь, когда у нас есть список Highload блоков, мы можем вывести информацию о каждом из них. Давайте выведем ID и название каждого блока:

// Выводим список Highload блоков
foreach ($hlblockList as $hlblock) {
    echo "ID: {$hlblock['ID']}, Название: {$hlblock['NAME']}" . PHP_EOL;
}

Допустим, у вас есть несколько Highload блоков: Products, Orders, Customers. Применяя вышеописанный код, вы сможете выводить не только их ID и названия, но и более подробную информацию о каждом блоке, такую как поля, структуру данных и т.д.

Пример использования: создание компонента на базе HL-блоков

Например, это можно использовать при создании собственного компонента который работает с Hl-блоками. Более продробный пример с применением в видео:
Создание компонента из HL-блока

Файл .paramets.php:

if (!defined('B_PROLOG_INCLUDED') || B_PROLOG_INCLUDED !== true) die();
/** @var array $arCurrentValues */
/** @global CUserTypeManager $USER_FIELD_MANAGER */
use Bitrix\Main\Loader;
use Bitrix\Highloadblock as HL;
use Bitrix\Main\Entity;
use Bitrix\Main\Localization\Loc;

Loader::includeModule('highloadblock');

// Получаем список всех Highload блоков
$arHlBlocksList = [];
$hlblockIterator = HL\HighloadBlockTable::getList();
while ($hlblock = $hlblockIterator->fetch()) {
    $arHlBlocksList[$hlblock['ID']] = '['.$hlblock['ID'].'] '.$hlblock['NAME'];;
}

if (!empty($arCurrentValues['HL_BLOCK'])) {// Получаем поля выбранного HL блока
    $hlblockId = $arCurrentValues['HL_BLOCK'];
   // Получаем информацию о Highload блоке
    $hlblock = HL\HighloadBlockTable::getById($hlblockId)->fetch();
   // Получаем описание сущности Highload блока
    $hlEntity = HL\HighloadBlockTable::compileEntity($hlblock);
   // Получаем список полей сущности
    $hlFields = $hlEntity->getFields();
   // Выводим список доступных полей
    foreach ($hlFields as $fieldName => $field) {
        $arHlBlocksFields[$fieldName] = $fieldName;
    }
}

$arComponentParameters = array(
    'PARAMETERS' => array(
        'SEF_MODE' => array(),
        'HL_BLOCK' => array(
            'PARENT' => 'BASE',
            'NAME' => 'Выберите HL блок',
            'TYPE' => 'LIST',
            'VALUES' => $arHlBlocksList,
            'REFRESH' => 'Y',
        ),
        'HL_BLOCK_FIELDS_NAME' => array(
            'PARENT' => 'BASE',
            'NAME' => 'Поле с названием слайда',
            'TYPE' => 'LIST',
            'VALUES' => $arHlBlocksFields,
            'REFRESH' => 'N',
            //'HIDDEN' => (empty($arCurrentValues['HL_BLOCK']) ? 'N' : 'Y')
        ),
        'HL_BLOCK_FIELDS_LINK' => array(
            'PARENT' => 'BASE',
            'NAME' => 'Поле с ссылкой со слайда',
            'TYPE' => 'LIST',
            'VALUES' => $arHlBlocksFields,
            'REFRESH' => 'N',
        ),
        'HL_BLOCK_FIELDS_PICTURE' => array(
            'PARENT' => 'BASE',
            'NAME' => 'Поле с картинкой слайда',
            'TYPE' => 'LIST',
            'VALUES' => $arHlBlocksFields,
            'REFRESH' => 'N',
        ),
    ),
);

Файл .component.php:

if (!defined('B_PROLOG_INCLUDED') || B_PROLOG_INCLUDED !== true) die();
$this->setFrameMode(false);

use Bitrix\Highloadblock as HL;
use Bitrix\Main\Entity;

$arResult = [];

$hlbl = (int)$arParams['HL_BLOCK'];
$hlblock = HL\HighloadBlockTable::getById($hlbl)->fetch();
$entity = HL\HighloadBlockTable::compileEntity($hlblock);
$entity_data_class = $entity->getDataClass();

$rsData = $entity_data_class::getList(array(
    'order' => array(
        'ID' => 'ASC'
    ),
    'cache' => [
        'ttl' => 3600 // можно в параметр
    ],
)); // можно ->fetchAll()

while($arData = $rsData->Fetch()){
    if ($arData[$arParams['HL_BLOCK_FIELDS_PICTURE']]) { //CFile::GetFileArray
        $arData[$arParams['HL_BLOCK_FIELDS_PICTURE']] = CFile::GetPath($arData[$arParams['HL_BLOCK_FIELDS_PICTURE']]);
    }
    $arResult[$arData['ID']]['NAME'] = $arData[$arParams['HL_BLOCK_FIELDS_NAME']];
    $arResult[$arData['ID']]['LINK'] = $arData[$arParams['HL_BLOCK_FIELDS_LINK']];
    $arResult[$arData['ID']]['PICTURE'] = $arData[$arParams['HL_BLOCK_FIELDS_PICTURE']];
}

$this->includeComponentTemplate();
Михаил Базаров 29.08.2023
Также, имейте в виду, что вы можете доработать этот код, добавив обработку ошибок, фильтрацию или дополнительные действия с полученной информацией.