PHP
#bitrix#highloadblock#php#orm#d7#dataManager

Загрузка элементов Highloadblock через D7 ORM

Работа с Highloadblock через \Bitrix\Main\Entity\DataManager с выборкой, фильтрацией и кешированием данных.

Как использовать

  1. Скопируйте нужный фрагмент кода.
  2. Вставьте в свой проект и при необходимости измените под задачу.
  3. Проверьте зависимости и окружение (версии, переменные).

Загрузка данных из Highloadblock через D7 ORM API. Используйте для работы со справочниками, дополнительными таблицами данных вместо прямых SQL-запросов.

use Bitrix\Main\Loader;
use Bitrix\Highloadblock\HighloadBlockTable;

/**
 * Получить DataManager для Highloadblock
 * @param string $tableName Имя таблицы Highloadblock
 * @return \Bitrix\Main\Entity\DataManager|null
 */
function getHLDataManager($tableName) {
    if (!Loader::includeModule('highloadblock')) {
        return null;
    }
    
    // Получаем ID Highloadblock по имени таблицы
    $hlblock = HighloadBlockTable::getList([
        'filter' => ['=TABLE_NAME' => $tableName]
    ])->fetch();
    
    if (!$hlblock) {
        return null;
    }
    
    // Получаем класс DataManager
    $entity = HighloadBlockTable::compileEntity($hlblock);
    return $entity->getDataClass();
}

/**
 * Получить элементы Highloadblock
 * @param string $tableName Имя таблицы
 * @param array $filter Фильтр ['UF_FIELD' => 'value']
 * @param array $order Сортировка ['UF_SORT' => 'ASC']
 * @param int $limit Лимит записей
 * @return array Массив элементов
 */
function getHLElements($tableName, $filter = [], $order = [], $limit = 0) {
    $dataClass = getHLDataManager($tableName);
    if (!$dataClass) {
        return [];
    }
    
    $params = [
        'select' => ['*'],
        'filter' => $filter
    ];
    
    if (!empty($order)) {
        $params['order'] = $order;
    }
    
    if ($limit > 0) {
        $params['limit'] = $limit;
    }
    
    $result = $dataClass::getList($params);
    
    $items = [];
    while ($item = $result->fetch()) {
        $items[] = $item;
    }
    
    return $items;
}

/**
 * Получить один элемент Highloadblock по ID
 * @param string $tableName Имя таблицы
 * @param int $id ID элемента
 * @return array|false
 */
function getHLElementById($tableName, $id) {
    $dataClass = getHLDataManager($tableName);
    if (!$dataClass) {
        return false;
    }
    
    return $dataClass::getById($id)->fetch();
}

Usage:

// Получить все элементы справочника городов
$cities = getHLElements('b_hlbd_cities', [], ['UF_NAME' => 'ASC']);

// Получить элементы с фильтром
$activeItems = getHLElements('b_hlbd_statuses', ['UF_ACTIVE' => 1], ['UF_SORT' => 'ASC']);

// Получить один элемент
$city = getHLElementById('b_hlbd_cities', 5);
if ($city) {
    echo $city['UF_NAME'];
}

Notes:

⚠️ Имя таблицы должно начинаться с b_hlbd_ (префикс Bitrix для Highloadblock). Для получения имени таблицы используйте HighloadBlockTable::getList() или смотрите в админке. Все пользовательские поля имеют префикс UF_. Модуль highloadblock должен быть подключен.