воскресенье, 9 марта 2014 г.

Highloadblock manual

В 14-ой версии Битрикса появился новый функционал - highload инфоблоки. Зачитать что это, можно тут. Далее примеры кода как с этим все работать.


1. Зная цифровой ИД сущности highload-блока ($hl_entity_id) подготавливаем сущность к работе:
\CModule::IncludeModule('highloadblock');
$hl_data = \Bitrix\Highloadblock\HighloadBlockTable::getById($hl_entity_id)->fetch();
$hl_entity = \Bitrix\Highloadblock\HighloadBlockTable::compileEntity($hl_data);
$hl_data_class = $hl_data['NAME'] . 'Table';


Далее все операции производим с участием $hl_data_class.

2. Добавление новой записи в hl-блок:
$hl_data_class::add(array(
    'UF_FIELD_1' => 'value_1',
    'UF_FIELD_2' => 'value_2'
));


Для добавления значения типа Да/Нет используется true/false (а не Y/N как можно подумать)
$hl_data_class::add(array(
    'UF_FIELD_1' => 'value_1',
    'UF_FIELD_ACTIVE' => true
));


Для получения ИД новой добавленой записи есть метод getId():
$res = $hl_data_class::add(array(
    'UF_FIELD_1' => 'value_1',
    'UF_FIELD_ACTIVE' => true
));
$new_id = $res->getId();


3. Обновление записи происходит аналогично, первым параметром передаем ИД ($id) обновляемой записи:
$hl_data_class::update($id, array(
    'UF_FIELD_1' => 'new_value_1',
    'UF_FIELD_2' => 'new_value_2'
));


4. С удалением записи я лично пока не столкнулся, но, вероятно, это происходит как-то так:
$hl_data_class::delete($id);

5. "Отлов" ошибок реализуется в простейшем случае так:
// инициализируем сущность
// ......
$res = $hl_data_class::add($some_data_array);
if (!$res->isSuccess()) {
    $err_list = '';
    foreach ($res->getError() as $error)
        $err_list .= $error->getMessage() . '; ';
}


6. Выборка данных реализуется методом getList():
// инициализируем сущность
// ......
$res = $hl_data_class::getList(array(
    // ограничиваем выборку условиями
    'filter' => array(
        'UF_FIELD_1' => 'value',
        'UF_FIELD_2' => 14,
        'UF_FIELD_ACTIVE' => true,
    ), 
    // ограничиваем поля выборки
    'select' => array(
        'ID', 'UF_FIELD_1', 'UF_FIELD_2'
    ), 
    // ограничиваем количество возвращаемых записей
    'limit' => 5,
    // сортируем в нужном порядке
    'order' => array(
        'UF_FIELD_2' => 'asc'
    ),
));
while ($row = $res->fetch()) {
    // пробегаем по результату выборки
}


Количество возвращаемых записей можно получить методом getSelectedRowsCount():
echo $res->getSelectedRowsCount();
Для получения количества всех записей можно воспользоваться методом getCount(), пока что (в версии 14.0.7) он не принимает никаких аргументов и возвращает общее число записей в таблице
echo $res = $hl_data_class::getCount();

7. Дату в поле типа Время пока что надо передавать так:
$res = $hl_data_class::add(array(
    'UF_FIELD_DATETIME' => date('d.m.Y H:i:s'),
    'UF_FIELD_ACTIVE' => true
));

Это пока всё, чем могу поделиться касаемо работы с highload-блоками.
Если будут вопросы - велкам в коменты.

8 комментариев:

  1. Как изменить сортировку записей на странице с компонентом bitrix:highloadblock.list?

    ОтветитьУдалить
  2. когда я в явном виде передаю через $_GET ?sort_type=ASC, то сортировка приобретает нормальный вид, иначе компонент сортирует записи по убыванию=(

    ОтветитьУдалить
    Ответы
    1. Сложно сказать не видя компонент, но вероятно там в настройках компонента должен быть параметр отвечающий за сортировку

      Удалить
    2. Посмотрел в компонент, настройки нет, только определение указан ли $_GET['sort_type']. Но в принципе этого достаточно, можно перед вызовом компонента установить $_GET['sort_type'] = 'ASC'. Костыль, но что делать.

      Удалить
  3. Пару слов про новый функционал , highload инфоблоки работают "шустрее", вот пример и измерения

    $connection = Bitrix\Main\Application::getConnection();
    $connection ->query('SET @rank=0');
    $siblingsElementIterator = $connection->query(
    ("SELECT
    `iblock_element`.`ID` AS `ID`,
    `iblock_element`.`NAME` AS `NAME`,
    `iblock_element`.`CODE` AS `CODE`,
    `iblock_element`.`DETAIL_PICTURE` AS `DETAIL_PICTURE`,
    `iblock_element`.`IBLOCK_SECTION_ID` AS `IBLOCK_SECTION_ID`
    FROM `b_iblock_element` `iblock_element`

    WHERE `iblock_element`.`IBLOCK_ID` = 1
    AND `iblock_element`.`ACTIVE` = 'Y'
    ORDER BY `iblock_element`.`ID` DESC")
    );
    $siblingsElements = array();
    while ($siblingsElement = $siblingsElementIterator ->fetch()) {
    $siblingsElements[] = $siblingsElement;
    }



    Время общее выполнения: 0.00331 попугаев


    global $DB; $DB->Query (тожесамое)

    Время общее выполнения: 0.00642 попугаев

    ОтветитьУдалить
    Ответы
    1. Вы просто выполнили здесь прямой запрос к БД. Где здесь работа с хайлоадблоками?

      Удалить
  4. Как в highloadblock реализовать сложный фильтр с ИЛИ?

    ОтветитьУдалить
    Ответы
    1. писал в статейке про это http://thisis-blog.ru/elementi-highload-bloka/#compl

      Удалить