Работа с элементами 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-инфоблоков.

ПоделитьсяShare on Facebook2Share on VKShare on Google+0Tweet about this on TwitterShare on LinkedIn0Pin on Pinterest1

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

Добавить комментарий