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

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();
			}
		}
	)
;
© «Битрикс», 2001-2024, «1С-Битрикс», 2024