Highload-блоки в Битрикс позволяют хранить большие объемы структурированных данных (например, справочники брендов, городов или категорий). Часто возникает задача получить данные из такого блока по ID элемента.
В этой статье разберем, как:
-
Получить ID элемента из инфоблока.
-
Найти связанную запись в Highload-блоке.
-
Вывести нужные данные (например, название бренда).
1. Подготовка: подключаем модули
Для работы с Highload-блоками нужны два модуля:
-
iblock – для работы с элементами инфоблоков.
-
highloadblock – для доступа к Highload-блокам.
if (!CModule::IncludeModule('iblock') {
throw new Exception('Модуль iblock не подключен');
}
if (!CModule::IncludeModule('highloadblock')) {
throw new Exception('Модуль highloadblock не подключен');
}2. Получаем данные элемента из инфоблока
Допустим, у нас есть товар ($product), и мы хотим узнать его бренд (значение свойства MANUFACTURER).
$productId = $product->getId();
$iBlockId = 8; // ID инфоблока с товарами
$manufacturerPropCode = 'MANUFACTURER'; // Символьный код свойства
// Запрашиваем элемент
$elementIterator = CIBlockElement::GetList(
["ID" => "ASC"],
[
"IBLOCK_ID" => $iBlockId,
"ID" => $productId,
"ACTIVE" => "Y", // Только активные
],
false,
false,
['ID', 'PROPERTY_' . $manufacturerPropCode]
);
if (!$element = $elementIterator->GetNext()) {
throw new Exception('Товар не найден');
}
$brandId = $element['PROPERTY_' . $manufacturerPropCode . '_VALUE'];
if (!$brandId) {
throw new Exception('Бренд не указан');
}3. Получаем данные из Highload-блока
Теперь, зная $brandId, можно получить название бренда из Highload-блока.
$highloadBlockId = 4; // ID Highload-блока с брендами
// Получаем сущность Highload-блока
$hlblock = Bitrix\Highloadblock\HighloadBlockTable::getById($highloadBlockId)->fetch();
if (!$hlblock) {
throw new Exception('Highload-блок не найден');
}
$entity = Bitrix\Highloadblock\HighloadBlockTable::compileEntity($hlblock);
$entityDataClass = $entity->getDataClass();
// Ищем бренд по ID
$brandData = $entityDataClass::getList([
'select' => ['UF_NAME', 'UF_XML_ID'], // Выбираем нужные поля
'filter' => ['ID' => $brandId],
'limit' => 1,
])->fetch();
if (!$brandData) {
throw new Exception('Бренд не найден в справочнике');
}
$brandName = $brandData['UF_NAME']; // Название бренда4. Вывод результата
Теперь можно вывести название бренда:
echo htmlspecialcharsbx($brandName); // Экранируем вывод5. Оптимизация и обработка ошибок
Кэширование запросов
Чтобы снизить нагрузку, можно кэшировать результат:
$cache = Bitrix\Main\Data\Cache::createInstance();
$cacheTime = 3600; // 1 час
$cacheId = 'brand_data_' . $brandId;
$cachePath = '/brands/';
if ($cache->initCache($cacheTime, $cacheId, $cachePath)) {
$brandName = $cache->getVars()['brandName'];
} elseif ($cache->startDataCache()) {
// Код получения данных из Highload-блока
$cache->endDataCache(['brandName' => $brandName]);
}Обработка ошибок
Лучше предусмотреть все возможные ошибки:
-
Элемент не найден.
-
Бренд не указан.
-
Highload-блок не существует.
Можно использовать try-catch или выводить значения по умолчанию:
try {
// Код получения данных
} catch (Exception $e) {
$brandName = 'Неизвестный бренд';
AddMessage2Log($e->getMessage(), 'main', 0, false);
}Заключение
Теперь вы знаете, как:
- Получить ID элемента из инфоблока.
- Найти запись в Highload-блоке.
- Оптимизировать запросы и обрабатывать ошибки.