Эта статья будет состоять из примеров задач с использованием highload-инфоблоков CMS 1c-Bitrix и соответственно решения этих задач с применением API D7.
Работать буду с highload-блоком
имеющий поля
записи
Содержание:
- Начальные приготовления
- Получить название полей highload-инфоблока
- Получить типы полей highload-инфоблока
- Получить все элементы highload-инфоблока
- Получить количество элементов highload-инфоблока
- Фильтр по полю типа ‘да/нет’
- Фильтр со сложной логикой
- Добавить новый элемент в highload-инфоблок
- Удалить элемент highload-инфоблока
- Обновить элемент highload-инфоблока
Начало
Подготовим подключение пространства имен, модуля хайлоад блоков и функцию, которая создаёт класс для работы с таблицей.
Этот участок кода будем использовать во всех приведенных ниже примерах!!!
<?php // подключаем пространство имен класса HighloadBlockTable и даём ему псевдоним HLBT для удобной работы use Bitrix\Highloadblock\HighloadBlockTable as HLBT; // id highload-инфоблока const MY_HL_BLOCK_ID = 1; //подключаем модуль highloadblock CModule::IncludeModule('highloadblock'); //Напишем функцию получения экземпляра класса: function GetEntityDataClass($HlBlockId) { if (empty($HlBlockId) || $HlBlockId < 1) { return false; } $hlblock = HLBT::getById($HlBlockId)->fetch(); $entity = HLBT::compileEntity($hlblock); $entity_data_class = $entity->getDataClass(); return $entity_data_class; } ?>
Поясню, что происходит в функции GetEntityDataClass. HLBT::getById($HlBlockId)->fetch() вернет массив информацию о highload-блоке $HlBlockId — ID, NAME и TABLE_NAME HLBT::compileEntity($hlblock) возвращает сущность(Bitrix\Main\Entity\Base) для работы с highload-блоком $hlblock т.е. простым языком делает за вас всю черную работу — создает класс и методы для работы с таблицей.
В следующих примерах я пропускал этот участок кода. Не забудьте про него!
Получить название полей highload-инфоблока
<?php use Bitrix\Highloadblock\HighloadBlockTable as HLBT; const MY_HL_BLOCK_ID = 1; CModule::IncludeModule('highloadblock'); $hlblock = HLBT::getById(MY_HL_BLOCK_ID)->fetch(); $entity = HLBT::compileEntity($hlblock); var_dump($entity->getFields()); ?>
Получаем массив, где ключи это поля highload-блока, а значения — объекты, соответствующие типу поля (строка — Bitrix\Main\Entity\StringField, число — Bitrix\Main\Entity\IntegerField).
Тип можно получить следующим образом(ID имя поля):
<?php var_dump(get_class($entity->getFields()['ID'])); ?>
Получить все элементы highload-инфоблока
<?php const MY_HL_BLOCK_ID = 1; CModule::IncludeModule('highloadblock'); $entity_data_class = GetEntityDataClass(MY_HL_BLOCK_ID); $rsData = $entity_data_class::getList(array( 'select' => array('*') )); while($el = $rsData->fetch()){ print_r($el); } ?>
Получить количество элементов highload-инфоблока
<?php const MY_HL_BLOCK_ID = 1; CModule::IncludeModule('highloadblock'); $entity_data_class = GetEntityDataClass(MY_HL_BLOCK_ID); var_dump($entity_data_class::getCount()); ?>
Фильтр по полю типа да/нет
Получить поля ‘Имя’ и ‘Значение’ активных элементов highload-инфоблока
Имеется свойство ‘UF_ACTIVE’ типа ‘Да/Нет’
1 — да
0 — нет
В select указываем нужные поля : ‘UF_NAME’ и ‘UF_VALUE’
<?php const MY_HL_BLOCK_ID = 1; CModule::IncludeModule('highloadblock'); $entity_data_class = GetEntityDataClass(MY_HL_BLOCK_ID); $rsData = $entity_data_class::getList(array( 'select' => array('UF_NAME', 'UF_VALUE'), 'order' => array('UF_NAME' => 'ASC'), 'limit' => '10',//ограничиваем выборку 10-ю элементами 'filter' => array('UF_ACTIVE' => '1') )); while($el = $rsData->fetch()){ var_dump($el); } ?>
Фильтр со сложной логикой
Получить цвета, имена которых начинаются на С или К.
<?php const MY_HL_BLOCK_ID = 1; CModule::IncludeModule('highloadblock'); $entity_data_class = GetEntityDataClass(MY_HL_BLOCK_ID); $arFilter = Array( Array( "LOGIC"=>"OR", Array( "UF_NAME"=>'с%' ), Array( "UF_NAME"=>'к%' ) ) ); $rsData = $entity_data_class::getList(array( 'select' => array('*'), 'filter' => $arFilter )); while($el = $rsData->fetch()){ var_dump($el); } ?>
Форматы фильтров остались прежние, можно посмотреть тут.
По умолчанию логика фильтра — AND, описанный выше фильтр пример логики — OR. Пример посложнее от Антипова Андрея
Добавить новый элемент в highload-инфоблок
<?php const MY_HL_BLOCK_ID = 1; CModule::IncludeModule('highloadblock'); $entity_data_class = GetEntityDataClass(MY_HL_BLOCK_ID); $result = $entity_data_class::add(array( 'UF_NAME' => 'Желтый', 'UF_CODE' => 'YELLOW', 'UF_VALUE' => '#ffff00', 'UF_ACTIVE' => '1' )); ?>
Удалить элемент highload-инфоблока
<?php const MY_HL_BLOCK_ID = 1; CModule::IncludeModule('highloadblock'); $idForDelete = 9; $entity_data_class = GetEntityDataClass(MY_HL_BLOCK_ID); $result = $entity_data_class::delete($idForDelete); ?>
Обновить элемент highload-инфоблока
<?php const MY_HL_BLOCK_ID = 1; CModule::IncludeModule('highloadblock'); $idForUpdate = 10; $entity_data_class = GetEntityDataClass(MY_HL_BLOCK_ID); $result = $entity_data_class::update($idForUpdate, array( 'UF_NAME' => 'Фиолетовый', 'UF_CODE' => 'PURPLE', 'UF_VALUE' => '#5A009D', 'UF_ACTIVE' => '1' )); ?>
В качестве доп. информации советую почитать страницу документации, где описывается метод getList на новом API D7. Так как все сущности теперь имеют стандартизированный метод getList, то и всё в этой статье справедливо для метода getList highload-инфоблоков.
Если ругается на функцию GetEntityDataClass, значит вы не добавили её. Она приведена в начале статьи!
Спасибо за статью. Помогла разобраться со сложной логикой, ни где не мог найти примеров использования.
Супер! Спасибо за статью! Я могу использовать ее на своем сайте со ссылкой сюда?
Рад , что оказалась полезной.
Да, можете.
Спасибо за статью!
Не плохо было бы еще почитать про обработчики событий для HL. Add, Update, Delete. Информации практически ни где нет. =(
http://thisis-blog.ru/obrabotchiki-sobytij-dlya-highload-blokov/
Подскажите, если пользовательское поле тип Список, как получить его значения? если через getList, то получает только ID
Спасибо!
А как сделать постраничную навигацию?
Или может быть есть аналогичные способы как при SQL-запросе, вроде ограничения по количеству выводимых элементов, либо возможность получить элементы, например, с ID=1 по ID=10, условно говоря.
Буду благодарен за помощь.