Работа с Highload блоками Битрикс через API D7
Последние записи
Подключение модуля
//Старый способ
CModule::IncludeModule("highloadblock");
//D7
use Bitrix\Main\Loader;
Loader::includeModule("highloadblock");
Добавление элементов в highload блок
use Bitrix\Main\Loader,
Bitrix\Highloadblock as HL,
Bitrix\Main\Entity;
Loader::includeModule("highloadblock");
$hlblock = HL\HighloadBlockTable::getById($ID)->fetch(); //где ID - id highloadblock блока в который будем добавлять элементы
$entity = HL\HighloadBlockTable::compileEntity($hlblock);
$entity_data_class = $entity->getDataClass();
//Массив добавляемых параметров
$data = array(
"UF_FIELD_1"=>'Значение 1',
"UF_FIELD_2"=>'Значение 2',
"UF_FIELD_3"=>'Значение 3'
);
$result = $entity_data_class::add($data);
if ($result->isSuccess()) {
echo 'успешно добавлен';
} else {
echo 'Ошибка: ' . implode(', ', $otvet->getErrors()) . "";
}
Получение элементов из highload блока
use Bitrix\Main\Loader,
Bitrix\Highloadblock as HL,
Bitrix\Main\Entity
Loader::includeModule("highloadblock");
$hlblock = HL\HighloadBlockTable::getById($ID)->fetch(); //где ID - id highloadblock блока из которого будем получать данные
$entity = HL\HighloadBlockTable::compileEntity($hlblock);
$entity_data_class = $entity->getDataClass();
$data = $entity_data_class::getList(array(
"select" => array("*"),
"order" => array("ID" => "DESC"),
"filter" => array("UF_FIELD_1"=>"Значение 1","UF_FIELD_2"=>'Значение 2',"UF_FIELD_3"=>'Значение 3') //Фильтрация выборки
));
while($arData = $data->Fetch()){
//Получаем значение типа список
$rsType = CUserFieldEnum::GetList(array(), array(
'USER_FIELD_NAME' => 'UF_TYPE',
//'USER_FIELD_ID' => 'ID'
));
foreach($rsType->arResult as $arType) {
print_r(arType);
}
//Обрабатываем результат
}
Обновление элементов в highload блоке
use Bitrix\Main\Loader,
Bitrix\Highloadblock as HL,
Bitrix\Main\Entity;
Loader::includeModule("highloadblock");
$hlblock = HL\HighloadBlockTable::getById($ID)->fetch(); //где ID - id highloadblock блока в котором будем обновлять данные
$entity = HL\HighloadBlockTable::compileEntity($hlblock);
$entity_data_class = $entity->getDataClass();
// Массив обновляемых полей
$data = array(
"UF_FIELD_1"=>'Значение 1',
"UF_FIELD_2"=>'Значение 2',
"UF_FIELD_3"=>'Значение 3'
);
$result = $entity_data_class::update($ELEMENT_ID, $data); // где $ELEMENT_ID - id обновляемой записи
Удаление элементов из highload блока
use Bitrix\Main\Loader,
Bitrix\Highloadblock as HL,
Bitrix\Main\Entity;
Loader::includeModule("highloadblock");
$hlblock = HL\HighloadBlockTable::getById($ID)->fetch(); //где ID - id highloadblock блока из которого удалим данные
$entity = HL\HighloadBlockTable::compileEntity($hlblock);
$entity_data_class = $entity->getDataClass();
$entity_data_class::Delete($ELEMENT_ID); //где $ELEMENT_ID - id удаляемой записи
Получение полей highload блока
use Bitrix\Highloadblock\HighloadBlockTable as HL;
Loader::includeModule("highloadblock");
$hlblock = HL::getById($ID)->fetch(); //где ID - id highloadblock блока
$entity = HL::compileEntity($hlblock);
$fields = $entity->getFields();
Получение количества элементов highload блока
CModule::IncludeModule('highloadblock');
$entity_data_class = GetEntityDataClass($ID); //где ID - id highloadblock блока
$count = $entity_data_class::getCount();
Highload блок фильтрация по полю Да\Нет
'filter' => array(
'UF_BOOLEAN_FIELD' => '1'
)
Highload блок фильтрация с логикой
$arFilter = Array(
Array(
"LOGIC"=>"AND", //Логическое И
Array(
"UF_TITLE"=>'a%' //Получаем записи начинающиеся на a
),
Array(
'UF_BOOLEAN_FIELD' => '1' //Поле Да\Нет установлено
)
)
);
Highload блок сложная фильтрация
Выбираем пользователя 20, а также пользователей имеющих значение пользовательского поля UF_SHMS = 770
, состоящих в группе 6
$arFilter = Array(
Array(
"LOGIC"=>"OR",
Array(
"ID"=>20
),
Array(
"UF_SHMS"=>770,
"Bitrix\Main\UserGroupTable:USER.GROUP_ID"=>6
)
)
);
Из-за того, что пользователь может состоять в нескольких группах. Получим несколько одинаковых записей. Это решается добавлением параметра "data_doubling"=>false
в getList
$res = Bitrix\Main\UserTable::getList(Array(
"select"=>Array("ID","NAME"),
"filter"=>$arFilter,
"data_doubling"=>false //Исключаем из выборки дублированные записи
));
Типы фильтрации из оф. документации
"!" - для строк выражение не попадающее под маску, или не равно (для остальных типов полей).
"?" - с применением логики, работает только для строковых свойств.
"<" - меньше;
"<=" - меньше либо равно;
">" - больше;
">=" - больше либо равно.
"=" - равно;
"!=" - не равно.
"%" - подстрока;
"!%" - не подстрока.
"><" - между;
"!><" - не между.
Частные правила фильтрации из оф. документации
$arFilter = array("PROPERTY_CML2_SCAN_CODE"=>false ) - используется, чтобы выбрать все элементы с незаполненным свойством;
$arFilter = array("PROPERTY_CML2_SCAN_CODE"=>"" ) - используется, чтобы выбрать все элементы;
$arFilter = array("PROPERTY_CML2_SCAN_CODE"=>"qwe" ) - при фильтрации элементов проверяется точное совпадение свойства с заданной строкой;
$arFilter = array("?PROPERTY_CML2_SCAN_CODE"=>"qwe" ) - при фильтрации элементов проверяется наличие заданной подстроки в свойстве.
$arFilter = array("!PROPERTY_CML2_SCAN_CODE"=>false ) - используется, чтобы выбрать только элементы с заполненным свойством;
$arFilter = array("!PROPERTY_CML2_SCAN_CODE"=>"qwe" ) - при фильтрации элементов проверяется отсутствие точного совпадения с заданной строкой ;
$arFilter = array("!?PROPERTY_CML2_SCAN_CODE"=>"qwe" ) - при фильтрации элементов проверяется отсутствие заданной подстроки в свойстве.
События highload блоков
OnBeforeAdd - Событие вызывается до добавление элемента highload(HL) блока и валидации полей. Можно модифицировать данные, добавить собственную валидацию, вернуть ошибку, если валидация не пройдена.
OnAdd - Событие вызывается перед добавлением в бд, после валидации полей. Модификация данных не доступна.
OnAfterAdd - Событие вызывается после добавления элемента HL блока. Можно добавить дополнительную логику, которая будет запускаться после добавления нового элемента данного HL-блока.
OnBeforeUpdate - Событие вызывается до обновления элемента highload(HL) блока и валидации полей. Можно модифицировать данные, добавить собственную валидацию, вернуть ошибку, если валидация не пройдена.
OnUpdate - Событие вызывается перед обновлением в бд, после валидации полей. Модификация данных не доступна.
OnAfterUpdate - Событие вызывается после обновления элемента HL блока. Можно добавить дополнительную логику, которая будет запускаться после обновления элемента данного HL-блока.
OnBeforeDelete - Событие вызывается до удаления элемента highload(HL) блока. Можно отменить удаление.
OnDelete - Событие вызывается перед удалением из бд. Отмена удаления не доступна.
OnAfterDelete - Событие вызывается после удаления элемента HL блока. Можно добавить дополнительную логику, которая будет запускаться после удаления элемента данного HL-блока.
Перехват события highload блока
$eventManager = \Bitrix\Main\EventManager::getInstance();
$eventManager->addEventHandler('', 'WebinarOptionsOnAfterAdd', 'OnAfterAdd'); //где "WebinarOptions" название highload блока
function OnAfterAdd(\Bitrix\Main\Entity\Event $event) {}
Событие Highload блока - OnBeforeAdd
Событие вызывается до добавление элемента highload(HL) блока и валидации полей.
Можно модифицировать данные, добавить собственную валидацию, вернуть ошибку, если валидация не пройдена.
$eventManager = \Bitrix\Main\EventManager::getInstance();
$eventManager->addEventHandler('', 'WebinarOptionsBeforeAdd', 'OnBeforeAdd');
function OnBeforeAdd(\Bitrix\Main\Entity\Event $event) {
$entity = $event->getEntity();
$entityDataClass = $entity->GetDataClass();
$eventType = $event->getEventType();// тип события. вернет WebinarOptionsBeforeAdd
$arFields = $event->getParameter("fields");// получаем массив полей хайлоад блока
$arParameters = $event->getParameters();//получить все доступные в этом событие данные
$result = new \Bitrix\Main\Entity\EventResult();
//модификация данных
if (empty($arFields['UF_FULL_DESCRIPTION'])) {
$arFields['UF_FULL_DESCRIPTION'] = $arFields['UF_DESCRIPTION'];
$result->modifyFields($arFields);
}
// для тестирования модификации данных закомментируйте этот блок
if (empty($arFields['UF_DESCRIPTION'])) {
$arErrors = Array();
$arErrors[] = new \Bitrix\Main\Entity\FieldError($entity->getField("UF_DESCRIPTION"), "Ошибка в поле UF_DESCRIPTION. Поле не должно быть пустым!");
$result->setErrors($arErrors);
}
return $result;
}
Событие Highload блока - OnAdd
Событие вызывается перед добавлением в бд, после валидации полей.
Модификация данных не доступна.
$eventManager = \Bitrix\Main\EventManager::getInstance();
$eventManager->addEventHandler('', 'ColorsOnAdd', 'OnAdd');
function OnAdd(\Bitrix\Main\Entity\Event $event) {
$entity = $event->getEntity();
$entityDataClass = $entity->GetDataClass();
// тип события. вернет ColorsOnAdd
$eventType = $event->getEventType();
// получаем массив полей хайлоад блока
$arFields = $event->getParameter("fields");
}
Событие Highload блока - OnAfterAdd
Событие вызывается после добавления элемента HL блока. Можно добавить дополнительную логику, которая будет запускаться после добавления нового элемента данного HL-блока.
$eventManager = \Bitrix\Main\EventManager::getInstance();
$eventManager->addEventHandler('', 'ColorsOnAfterAdd', 'OnAfterAdd');
function OnAfterAdd(\Bitrix\Main\Entity\Event $event) {
//id добавляемого элемента
$id = $event->getParameter("id");
$entity = $event->getEntity();
$entityDataClass = $entity->GetDataClass();
// тип события. вернет ColorsOnAfterAdd
$eventType = $event->getEventType();
// получаем массив полей хайлоад блока
$arFields = $event->getParameter("fields");
}
Событие Highload блока - OnBeforeUpdate
Событие вызывается до обновления элемента highload(HL) блока и валидации полей.
Можно модифицировать данные, добавить собственную валидацию, вернуть ошибку, если валидация не пройдена.
$eventManager = \Bitrix\Main\EventManager::getInstance();
$eventManager->addEventHandler('', 'ColorsOnBeforeUpdate', 'OnBeforeUpdate');
function OnBeforeUpdate(\Bitrix\Main\Entity\Event $event) {
$id = $event->getParameter("id");
//id обновляемого элемента
$id = $id["ID"];
$entity = $event->getEntity();
$entityDataClass = $entity->GetDataClass();
// тип события. вернет ColorsOnBeforeUpdate
$eventType = $event->getEventType();
// получаем массив полей хайлоад блока
$arFields = $event->getParameter("fields");
$result = new \Bitrix\Main\Entity\EventResult();
//модификация данных
if (empty($arFields['UF_FULL_DESCRIPTION'])) {
$arFields['UF_FULL_DESCRIPTION'] = $arFields['UF_DESCRIPTION'];
$result->modifyFields($arFields);
}
// для тестирования модификации данных закомментируйте этот блок
if (empty($arFields['UF_DESCRIPTION'])) {
$arErrors = Array();
$arErrors[] = new \Bitrix\Main\Entity\FieldError($entity->getField("UF_DESCRIPTION"), "Ошибка в поле UF_DESCRIPTION. Поле не должно быть пустым!");
$result->setErrors($arErrors);
}
return $result;
}
Событие Highload блока - OnUpdate
Событие вызывается перед обновлением в бд, после валидации полей.
Модификация данных не доступна.
$eventManager = \Bitrix\Main\EventManager::getInstance();
$eventManager->addEventHandler('', 'ColorsOnUpdate', 'OnUpdate');
function OnUpdate(\Bitrix\Main\Entity\Event $event) {
$id = $event->getParameter("id");
//id обновляемого элемента
$id = $id["ID"];
$entity = $event->getEntity();
$entityDataClass = $entity->GetDataClass();
// тип события. вернет ColorsOnUpdate
$eventType = $event->getEventType();
// получаем массив полей хайлоад блока
$arFields = $event->getParameter("fields");
}
Событие Highload блока - OnAfterUpdate
Событие вызывается после обновления элемента HL блока. Можно добавить дополнительную логику, которая будет запускаться после обновления элемента данного HL-блока.
$eventManager = \Bitrix\Main\EventManager::getInstance();
$eventManager->addEventHandler('', 'ColorsOnAfterUpdate', 'OnAfterUpdate');
function OnAfterUpdate(\Bitrix\Main\Entity\Event $event) {
$id = $event->getParameter("id");
//id обновляемого элемента
$id = $id["ID"];
$entity = $event->getEntity();
$entityDataClass = $entity->GetDataClass();
// тип события. вернет ColorsOnAfterUpdate
$eventType = $event->getEventType();
// получаем массив полей хайлоад блока
$arFields = $event->getParameter("fields");
}
Событие Highload блока - OnBeforeDelete
Событие вызывается до удаления элемента highload(HL) блока.
Можно отменить удаление.
$eventManager = \Bitrix\Main\EventManager::getInstance();
$eventManager->addEventHandler('', 'ColorsOnBeforeDelete', 'OnBeforeDelete');
function OnBeforeDelete(\Bitrix\Main\Entity\Event $event) {
// поля в этом событии недоступны, только id
$id = $event->getParameter("id");
//id удаляемого элемента
$id = $id["ID"];
$entity = $event->getEntity();
$entityDataClass = $entity->GetDataClass();
// тип события. вернет ColorsOnBeforeDelete
$eventType = $event->getEventType();
$result = new \Bitrix\Main\Entity\EventResult();
if ($id <= 20) {
$arErrors = Array();
$arErrors[] = new \Bitrix\Main\Entity\EntityError("Ошибка! Нельзя удалять первые 20 элементов!");
$result->setErrors($arErrors);
}
return $result;
}
Событие Highload блока - OnDelete
Событие вызывается перед удалением из бд. Отмена удаления не доступна.
$eventManager = \Bitrix\Main\EventManager::getInstance();
$eventManager->addEventHandler('', 'ColorsOnDelete', 'OnDelete');
function OnDelete(\Bitrix\Main\Entity\Event $event) {
// поля в этом событии недоступны, только id
$id = $event->getParameter("id");
//id удаляемого элемента
$id = $id["ID"];
$entity = $event->getEntity();
$entityDataClass = $entity->GetDataClass();
// тип события. вернет ColorsOnDelete
$eventType = $event->getEventType();
}
Событие Highload блока - OnAfterDelete
Событие вызывается после удаления элемента HL блока. Можно добавить дополнительную логику, которая будет запускаться после удаления элемента данного HL-блока.
$eventManager = \Bitrix\Main\EventManager::getInstance();
$eventManager->addEventHandler('', 'ColorsOnAfterDelete', 'OnAfterDelete');
function OnAfterDelete(\Bitrix\Main\Entity\Event $event) {
$id = $event->getParameter("id");
//id удаляемого элемента
$id = $id["ID"];
$entity = $event->getEntity();
$entityDataClass = $entity->GetDataClass();
// тип события. вернет ColorsOnAfterAdd
$eventType = $event->getEventType();
if ($id > 30 && $id < 1000) {
// ваша логика....
}
}
Использовались материалы:
Комментарии