Работа с элементами highload инфоблока

Эта статья будет состоять из примеров задач с использованием highload-инфоблоков CMS 1c-Bitrix и соответственно решения этих задач с применением API D7.
Работать буду с highload-блоком

bitrix highload block name

имеющий поля

highload block fields

записи

битркс заполненный хайлоад block

Содержание:

  1. Начальные приготовления
  2. Получить название полей highload-инфоблока
  3. Получить типы полей highload-инфоблока
  4. Получить все элементы highload-инфоблока
  5. Получить количество элементов highload-инфоблока
  6. Фильтр по полю типа ‘да/нет’
  7. Фильтр со сложной логикой
  8. Добавить новый элемент в highload-инфоблок
  9. Удалить элемент highload-инфоблока
  10. Обновить элемент 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);
}
?>
getlist get all elements

Получить количество элементов 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);
}
?>
getlist get all elements

Фильтр со сложной логикой

Получить цвета, имена которых начинаются на С или К.

<?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);
}
?>
getlist filter OR logic



Форматы фильтров остались прежние, можно посмотреть тут.
По умолчанию логика фильтра — 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-инфоблоков.

Рекомендуем к прочтению



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

  • shapito27:

    Если ругается на функцию GetEntityDataClass, значит вы не добавили её. Она приведена в начале статьи!

  • Алексей:

    Спасибо за статью. Помогла разобраться со сложной логикой, ни где не мог найти примеров использования.

  • Vadik:

    Супер! Спасибо за статью! Я могу использовать ее на своем сайте со ссылкой сюда?

  • Александр:

    Спасибо за статью!
    Не плохо было бы еще почитать про обработчики событий для HL. Add, Update, Delete. Информации практически ни где нет. =(

  • Юлия:

    Подскажите, если пользовательское поле тип Список, как получить его значения? если через getList, то получает только ID

  • Андрей:

    Спасибо!
    А как сделать постраничную навигацию?
    Или может быть есть аналогичные способы как при SQL-запросе, вроде ограничения по количеству выводимых элементов, либо возможность получить элементы, например, с ID=1 по ID=10, условно говоря.
    Буду благодарен за помощь.

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

Этот сайт защищен reCAPTCHA и применяются Политика конфиденциальности и Условия обслуживания применять.

Срок проверки reCAPTCHA истек. Перезагрузите страницу.