Эта статья будет состоять из примеров задач с использованием 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, условно говоря.
Буду благодарен за помощь.