Операции
Общее
Каждое изменение элемента любого типа CRM сопровождается большим количеством проверок и связанных действий.
Чтобы весь этот процесс был прозрачным, было решено сосредоточить это всё в одном классе.
Т.к. каждый тип сущности может иметь свои особенности и дополнительные действия, то экземпляр объекта получается через фабрику.
После получения объекта его можно дополнительным образом сконфигурировать.
Запуск выполняется методом launch
, который вернет объект \Bitrix\Main\Result
.
В общем случае, процесс выполняется следующим образом:
- Проверка тарифных ограничений.
- Проверка прав доступа к элементу.
- Проверка прав доступа.
- Проверка запущенных бизнес-процессов.
- Выполнение бизнес-логики полей до сохранения.
- Проверка заполнености обязательных полей.
- Если к этому моменту элемент не был изменен, то дальнейшие действия не производятся.
- Выполнение дополнительных действий до сохранения.
- Сохранение элемента.
- Выполнение бизнес-логики полей после сохранения.
- Обновление данных о правах доступа.
- Обновление поискового индекса.
- Сохранение истории действий над элементом.
- Запись данных в таймлайн.
- Выполнение дополнительных действий после сохранения.
- Отправка пуш-уведомления.
- Запуск роботов и шаблонов бизнес-процессов.
Методы, выполняющие проверки и изменения, являются публичными.
При необходимости можно получить объект операции и вызвать, например, проверку прав доступа, до запуска самой операции.
Методы
Метод | Описание | С версии |
---|---|---|
public function __construct (Item $item, Operation\Settings $settings, Collection $fieldsCollection = null) |
Конструктор.
В конструктор необходимо передать элемент, настройки и коллекцию полей. Если не передать $fieldsCollection, то весь функционал, завязанный на поля, не будет выполняться. | |
public function exportSettings(): Operation\Settings |
Возвращает текущий объект настроек. Возвращается тот же объект, а не копия. | |
ppublic function importSettings (Operation\Settings $settings): self |
Устанавливает новый объект настроек для операции. | |
public function getContext(): Context |
Возвращает текущий контекст выполнения операции. | |
public function setContext(Context $context): self |
Устанавливает новый контекст выполнения операции. | |
public function getItem(): Item |
Возвращает элемент, над которым выполняется операция. | |
public function getItemBeforeSave(): Item |
Возвращает копию элемента в его состоянии до сохранения в базу данных. Эта копия есть только после вызова launch() . | |
public function addAction (string $actionPlacement, Action $action): self |
Добавляет дополнительное действие $action на место $actionPlacement.
$actionPlacement может принимать значение beforeSave(Operation::ACTION_BEFORE_SAVE) или afterSave(Operation::ACTION_AFTER_SAVE) . | |
public function launch(): Result |
Запускает выполнение операции. Возвращает \Bitrix\Main\Result . | |
public function checkAccess(): Result |
Выполняет проверку прав доступа. | |
public function processFieldsWithPermissions(): Result |
Выполняет проверку прав доступа полей. | |
public function processFieldsBeforeSave(): Result |
Выполняет проверку полей до сохранения. | |
public function checkFields(): Result |
| |
public function checkRequiredFields (array $requiredFields, Factory $factory): Result |
Метод проверяет, что поля $requtedFields заполнены. $factory - фабрика.
В массиве $requiredFields содержится индексный массив с кодами полей, заполненность которых надо проверить. | |
public function processFieldsAfterSave(): Result |
Выполняет бизнес-логику полей после сохранения. Если какое-то из значений было изменено, то элемент будет сохранен повторно. | |
public function getStageDependantRequiredFields (Factory $factory): array |
Возвращает коды зависимых от стадии обязательных полей, заполненность которых необходимо проверить при выполнении данной операции. | |
public function isItemChanged(): bool |
Возвращает true, если значения полей элемента были изменены, за исключением тех, значения которых генерируются автоматически. | |
public function checkRunningWorkflows(): Result |
Проверяет, что у элемента нет запущенных бизнес-процессов при смене направления. Если направление не меняется, то эта проверка не производится. |
Метод конфигурации
Для управления настройками выполнения операции можно получить объект настройки и работать с его методами напрямую.
Или можно вызвать методы этого класса и работать с настройками.
Метод | Описание |
---|---|
public function disableAllChecks(): self | Метод отключает все проверки при выполнении операции.
Вызов этого метода аналогичен вызову методов disableCheckWorkflows() , disableCheckAccess() , disableCheckFields() , disableCheckRequiredUserFields() . |
enableAutomation / disableAutomation / isAutomationEnabled | Управление запуском роботов. |
enableBizProc / disableBizProc / isBizProcEnabled | Управление запуском шаблонов бизнес-процессов. |
enableCheckAccess / disableCheckAccess / isCheckAccessEnabled | Управление проверкой прав доступа. |
isCheckFieldsEnabled / enableCheckFields / disableCheckFields | Управление проверкой корректности заполения полей и проверкой заполненности обязательных полей. |
enableCheckRequiredUserFields / disableCheckRequiredUserFields / isCheckRequiredUserFields | Управление проверкой заполненности обязательных полей. |
enableFieldProcession / disableFieldProcession / isFieldProcessionEnabled | Управление проверками и изменениями, связанными с бизнес-логикой полей. |
enableSaveToHistory / disableSaveToHistory / isSaveToHistoryEnabled | Управление записью в историю изменений. |
enableBeforeSaveActions / disableBeforeSaveActions / isBeforeSaveActionsEnabled | Управление дополнительными действиями до сохранения. |
enableAfterSaveActions / disableAfterSaveActions / isAfterSaveActionsEnabled | Управление дополнительными действиями после сохранения. |
enableCheckWorkflows / disableCheckWorkflows / isCheckWorkflowsEnabled | Управление проверкой запущенных бизнес-процессов. |
Наследники
Базовый класс операции является абстрактным. У этого класса есть пять реализаций, выполняющий разные виды операций:
Operation\Add
- добавление.Operation\Update
- изменение.Operation\Delete
- удаление.Operation\Copy
- копирование.Operation\Conversion
- конвертация.
В каждом из этих классов переопределены методы, отвечающие за особенности той или иной операции. Но в целом, процесс выполнения выполняется в том же порядке.
Разница в том, что, например, при удалении не запускаются роботы и бизнес-процессы - в этом нет смысла.
Примеры
use Bitrix\Crm\Service; $entityTypeId = 128; $factory = Service\Container::getInstance()->getFactory($entityTypeId); $item = $factory->createItem(); $item->setStageId('D128_3:CLIENT'); $operation = $factory->getAddOperation($item) ->disableCheckAccess() ->disableCheckFields(); $result = $operation->launch(); if (!$result->isSuccess()) { print_r($result->getErrorMessages()); } $newId = $item->getId();
Обновление Предложения с запуском связанных действий
\Bitrix\Main\Loader::includeModule('crm'); use Bitrix\Crm\Service; $factory = Service\Container::getInstance()->getFactory(\CCrmOwnerType::Quote); $itemId = 3; // ID сущности $item = $factory->getItem($itemId); if ($item) { $item->setStageId('SENT'); } $operation = $factory->getUpdateOperation($item) ->disableCheckAccess() ->disableCheckFields(); $result = $operation->launch(); if (!$result->isSuccess()) { print_r($result->getErrorMessages()); }