Обработчики событий для highload блоков

В предыдущей статье по хайлоад блокам я писал о работе с элементами. В этой рассмотрим, как работать с событиями highload блоков: добавления, обновления, удаления.
Порядок вызова событий и допустимые действия в обработчиках каждого из них:

Порядок вызова событий и допустимые действия в обработчиках каждого из нихисточник (https://dev.1c-bitrix.ru/learning/course/?COURSE_ID=43&LESSON_ID=2244&LESSON_PATH=3913.5062.5748.2244#events)

Все примеры будут производиться с использованием highload блока — Colors.
Поля:
поля хайлоад блока

Нужно уловить принцип написания функции addEventHandler для различных событий. Второй аргумент — это название вашего highload блока и название самого события.

На моём примере:

$eventManager->addEventHandler('', 'ColorsOnBeforeUpdate', 'OnBeforeUpdate');
$eventManager->addEventHandler('', 'ColorsOnAfterAdd', 'OnAfterAdd');
и т.д. ...

Содержание:

  1. OnBeforeAdd
  2. OnAdd
  3. OnAfterAdd
  4. OnBeforeUpdate
  5. OnUpdate
  6. OnAfterUpdate
  7. OnBeforeDelete
  8. OnDelete
  9. OnAfterDelete

Код нужно разместить в файле init.php.

OnBeforeAdd

Событие вызывается до добавление элемента highload(HL) блока и валидации полей.
Можно модифицировать данные, добавить собственную валидацию, вернуть ошибку, если валидация не пройдена.
Пример:

$eventManager = \Bitrix\Main\EventManager::getInstance();
$eventManager->addEventHandler('', 'ColorsOnBeforeAdd', 'OnBeforeAdd');

/**
 *
 * @param \Bitrix\Main\Entity\Event $event
 * @return \Bitrix\Main\Entity\EventResult
 */
function OnBeforeAdd(\Bitrix\Main\Entity\Event $event) {
    $entity = $event->getEntity();
    $entityDataClass = $entity->GetDataClass();
// тип события. вернет ColorsOnBeforeAdd
    $eventType = $event->getEventType();
// получаем массив полей хайлоад блока
    $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;
}

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");
}

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");
}

OnBeforeUpdate

Событие вызывается до обновления элемента highload(HL) блока и валидации полей.
Можно модифицировать данные, добавить собственную валидацию, вернуть ошибку, если валидация не пройдена.
Пример:

$eventManager = \Bitrix\Main\EventManager::getInstance();
$eventManager->addEventHandler('', 'ColorsOnBeforeUpdate', 'OnBeforeUpdate');

/**
 *
 * @param \Bitrix\Main\Entity\Event $event
 * @return \Bitrix\Main\Entity\EventResult
 */
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;
}

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");
}

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");
}

OnBeforeDelete

Событие вызывается до удаления элемента highload(HL) блока.
Можно отменить удаление.
Пример:

$eventManager = \Bitrix\Main\EventManager::getInstance();
$eventManager->addEventHandler('', 'ColorsOnBeforeDelete', 'OnBeforeDelete');

/**
 *
 * @param \Bitrix\Main\Entity\Event $event
 * @return \Bitrix\Main\Entity\EventResult
 */
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;
}

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();
}

OnAfterDelete

Событие вызывается после удаления элемента HL блока. Можно добавить дополнительную логику, которая будет запускаться после удаления элемента данного HL-блока.
Пример:

$eventManager = \Bitrix\Main\EventManager::getInstance();
$eventManager->addEventHandler('', 'ColorsOnAfterDelete', 'OnAfterDelete');

/**
 *
 * @param \Bitrix\Main\Entity\Event $event
 */
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) {
// ваша логика....
    }
}
ПоделитьсяShare on Facebook0Share on VKShare on Google+0Tweet about this on TwitterShare on LinkedIn0Pin on Pinterest0
Категории: Api D7, Битрикс API

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