Документация для разработчиков
Темная тема

Action

Описание класса


В данный момент уже есть пять видов операций. При этом у каждого типа сущности есть свои особенности при выполнении операций.

Чтобы иерархия классов не разрасталась, было принято решение вынести дополнительные действия в отдельную иерархию классов, чтобы каждый тип сущности мог управлять ими при запуске операций.

Класс Bitrix\Crm\Service\Operation\Action является абстрактным с единственным методом:

abstract public function process(Item $item): Result;

В этом методе могут быть произведены какие-то проверки, и если произошла ошибка, то её необходимо добавить в результат выполнения метода.

Здесь же можно изменить состояние объекта $item, если это действие до сохранения.

Если действие после сохранения, можно вызвать $item->save() ещё раз.

Добавление действия производится через метод Service\Operation::addAction().

При добавлении действий не обязательно делать полноценного наследника, достаточно воспользоваться анонимным классом.

В настоящее время есть следующие реализации дополнительных действий:

  • Action\CheckRestrictions - проверка ограничений.
  • Action\ClearCache - сброс кеша.
  • Action\MoveToBin - перенос в корзину.
  • Action\SendEventCompatible - отправка и обработка событий. У этого класса есть ещё наследники для разных типов событий.

Примеры


use Bitrix\Crm\Service;

$entityTypeId = 128;

$factory = Service\Container::getInstance()->getFactory($entityTypeId);

$item = $factory->getItem(100);

$operation = $factory->getUpdateOperation($item);

$operation
    ->addAction(
        Operation ::ACTION_BEFORE_SAVE,
        new class extends Operation \Action {
            public function process(Item $item): Result
            {
                $result = new Result();
                
                if ($item->getId() > 100)
                {
                    $result->addError (new Error('id is too big!' ));
                }
                
                return $result;
            }
        }
    )
    ->addAction(
        Operation ::ACTION_AFTER_SAVE,
        new class extends Operation \Action {
            public function process(Item $item): Result
            {
                // send notification, log changes etc. 
                return new Result();
            }
        }
    )
;

Пользовательские комментарии

Мы будем рады, если разработчики добавят свои комментарии по практическому использованию методов системы.

Для этого нужно всего лишь авторизоваться на сайте

Но помните, что Пользовательские комментарии, несмотря на модерацию, не являются официальной документацией. Ответственность за их использование несет сам пользователь.

Также Пользовательские комментарии не являются местом для обсуждения функционала. По подобным вопросам обращайтесь на форумы.
0
Андрей Николаев
Сообщение не промодерировано, возможны ошибки и неточности.
Допущена небольшая ошибка в описании.
В use секции указано "use Bitrix\Crm\Service;", в то время как все классы описаны как "Operation::ACTION_AFTER_SAVE"
Т.е. нужно либо добавить еще один use либо заменить Operation на Service\Operation.

И было бы неплохо убрать пробелы из кода (между Operation и двумя двоиточиями)
© «Битрикс», 2001-2023, «1С-Битрикс», 2023
Наверх