Highload инфоблоки

Так как официальной документации пока нет, а разбираться с работой нового функционала надо, я полез в исходные коды модуля, чтобы понять что да как. Хочется думать что в будущем разработчики битрикс упростят работу с Highload инфоблоками, потому что сейчас не совсем удобно.

Шаг 1. Объект - сущность инфоблока

Все манипуляции с элементами Highload инфоблока начинаются с объекта - сущности инфоблока.

Для начала нужно получить описательный массив инфоблока в виде:

Array
(
    [ID] => 4
    [NAME] => LANG
    [TABLE_NAME] => lang
    [FIELDS_COUNT] => 3
)

Для этого:


CModule::IncludeModule('highloadblock');
$rsData = \Bitrix\Highloadblock\HighloadBlockTable::getList(array('filter'=>array('NAME'=>'LANG')));
if ( !($arData = $rsData->fetch()) ){
    echo 'Инфоблок не найден';
}

Если не указывать параметр в функции getList - то функция вернет информацию о всех инфоблоках

Теперь получим объект - сущность.


$Entity = \Bitrix\Highloadblock\HighloadBlockTable::compileEntity($arData);

Получение элементов


//Создадим объект - запрос
$Query = new \Bitrix\Main\Entity\Query($Entity); 

//Зададим параметры запроса, любой параметр можно опустить
$Query->setSelect(array('*'));
$Query->setFilter(array('ID'=> array(2,12,6)));
$Query->setOrder(array('UF_SORT' => 'ASC'));

//Выполним запрос
$result = $Query->exec();

//Получаем результат по привычной схеме
$result = new CDBResult($result);
$arLang = array();
while ($row = $result->Fetch()){
    $arLang[$row['UF_KEY']] = $row;
}

Добавление / обновление элемента


//Создадим объект DataClass
$DataClass = $Entity->getDataClass();
                    
//Зададим поля нового или обновляемого элемента. Если указать не все поля,
//то неуказанные поля останутся без изменения
$arBxData = array(
    'UF_KEY' => 'newKey',
    'UF_NAME' => 'newName',
    'UF_SORT' => 500,
);

if ($arParams['ID']){
    //Обновим элемент
    $result = $DataClass::update($arParams['ID'], $arBxData);
    if(!$result->isSuccess()){ //произошла ошибка
         echo implode(', ', $result->getErrorMessages()); //выведем ошибки
    }
} else {
    //Добавим новый элемент
    $result = $DataClass::add($arBxData);
    if(!$result->isSuccess()){
        echo implode(', ', $result->getErrorMessages()); //выведем ошибки
    }
    echo 'NewId:'.$result->getId();//Id нового элемента
}                          

Удаление элемента


//Создадим объект DataClass
$DataClass = $Entity->getDataClass();

$result = $DataClass::delete($arParams['ID']);
if(!$result->isSuccess()){ //произошла ошибка
     echo implode(', ', $result->getErrorMessages()); //выведем ошибки
} else {
   echo 'ok';
}

Комментарии:

Алексей

06.06.2014 11:46:25

А нет каких нибудь статей по созданию HL инфоблоков

xxx

17.06.2014 15:44:08

Пример left outer join

Максим

06.07.2014 18:47:01

"Пример left outer join" - Highload инфоблок, по факту, это обычная таблица в базе. Следовательно можно использовать любые SQL запросы c помощью глобального объекта $DB. Ссылка на документацию.

mariva

31.08.2014 20:29:41

Спасибо! Наиболее внятный пример из нагугленного.

Артём

04.09.2014 12:05:28

Спасибо! Очень пригодилось.

Александр

24.12.2014 11:35:38

Спасибо за статью!

Артем

12.06.2015 12:08:15

Спасибо большое)

Михаил

25.06.2015 20:13:51

Спасибо!

Лаки

24.11.2015 14:05:31

Как с помощью $Query->exec получить случайный элемент?

andyzee

12.01.2016 09:30:59

что-то вроде $Query->setOrder(array('ID'=>'RAND'))->exec()->fetch() скорее всего поможет

Матвей

07.04.2016 06:54:25

Получать данные тоже лучше через датакласс

$Entity = \Bitrix\Highloadblock\HighloadBlockTable::compileEntity($arData);
$DataClass = $Entity->getDataClass();
$parametrs = Array(
'select' => Array(
"ID",
"UF_CITY",
"CITY_NAME" => "UF_CITY_REF.UF_NAME",
"UF_STREET",
"STREET_NAME" => "UF_STREET_REF.UF_NAME",
"UF_HOUSE",
"HOUSE_NAME" => "UF_HOUSE_REF.UF_NAME",
),
'filter' => Array(
"UF_BRANCH" => $arElement["ID"],
),
);
$rsOffices = $DataClass::GetList($parametrs);
while ($arOffice = $rsOffices->Fetch()) {
// code
}

здесь UF_CITY - это поле типа ссылка на другой хайлоад, что добавляет виртуальное поле UF_CITY_REF. через которое мы можем получать свойства из другой таблицы.
Инфоблоки к сожалению через рантайм приходится делать. А для свойств инфоблоков приходится новые классы заводить.

Александр

22.06.2016 15:30:39

Макс спасибо!

Оставить комментарий:

Представьтесь пожалуйста:
Электронная почта:
Электронный адрес не публикуются
Текст сообщения:
Для подсветки кода, оборачивайте ваш код в теги <code></code>
Введите 5 цифр с картинки:

Рекомендую:

Поддержать проект:

бесполезная кнопка, которую еще никто не нажал:)
Нажали! Кнопку нажали уже 7 человек!!! Спасибо, очень мотивирует!