Работа с процессами
Table of Contents
Все взаимодействие с новым API CRM и смарт-процессами в частности осуществляется посредством взаимодействия с сервисами из контейнера \Bitrix\Crm\Service\Container
. Это означает что перед выполнением любой операции необходимо сначала получить контейнер, затем достать из него нужный сервис и уже после выполнить действие.
Несмотря на то что в некоторых случаях можно обойтись без контейнеров, использование их строго рекомендовано, чтобы обеспечивать возможность наследования и переопределения действий.
Пример получения контейнера для дальнейшей работы:
use \Bitrix\Crm\Service;
/**
* @var Container
*/
$container = Service\Container::getInstance();
Получить зарегистрированные процессы
Для получения списка смарт-процессов необходимо сначала получить название таблета, с которым можно работать, как и с любым другим DataManager объектом.
use \Bitrix\Crm\Service;
/**
* @var Container
*/
$container = Service\Container::getInstance();
/**
* @var \Bitrix\Crm\Model\Dynamic\TypeTable
*/
$typeDataClass = $container->getDynamicTypeDataClass();
/**
* @var Bitrix\Main\ORM\Query\Result
*/
$listDynamicTypes = $typeDataClass::getList([
'select' => ['*']
]);
Создание и редактирование процесса
При работе с ORM нет отдельных операций на создание и редактирование процесса, вместо этого все это определяется единым методом сохранения и обновлением сопутствующей информации.
Ход сохранения смарт-процесса:
- Получение объекта (
\Bitrix\Crm\Model\Dynamic\Type
) - Изменение полей. Сохранение смарт-процесса.
- Сохранение конверсионной схемы
- Обновление разрешений для пользовательских полей
- Обновление связей
- Обновление раздела (если выводится в собственном разделе)
Рассмотрим пример создания своего смарт-процесса: предположим нам необходимо создать типовой смарт-процесс для хранения NDA (соглашение о неразглашении) со стандартными полями (Название, Ответственный), привязкой к задачам. В данном примере мы не будем обновлять связи, не затрагиваем конверсионную карту и не будем обновлять отдельный раздел.
use \Bitrix\Crm\Service,
\Bitrix\Crm\UserField;
/**
* @var Container
*/
$container = Service\Container::getInstance();
/**
* @var \Bitrix\Crm\Model\Dynamic\TypeTable
*/
$typeDataClass = $container->getDynamicTypeDataClass();
/**
* @var \Bitrix\Crm\Model\Dynamic\Type
*/
$type = $typeDataClass::createObject();
$type->set('TITLE', 'NDA') // Заголовок
->set('CODE', 'NDA') // Символьный код.
->set('IS_USE_IN_USERFIELD_ENABLED', 'Y') // Флаг, разрешающий использование польз.полей.
;
/**
* @var \Bitrix\Main\Result
*/
$result = $type->save();
if ( !$result->isSuccess() )
{
/**
* Get error \Bitrix\Main\Error[] $result->getErrors()
* Get error messages string[] $result->getErrorMessages()
*/
reutrn;
}
$entityTypeName = \CCrmOwnerType::ResolveName($type->getEntityTypeId());
$settings = [
'TASKS_TASK|UF_CRM_TASK' => 'true', // Connected with task
//'TASKS_TASK_TEMPLATE|UF_CRM_TAS' => 'true', // Connected with task template
//'CALENDAR_EVENT|UF_CRM_CAL_EVENT' => 'true', // Connected with calendar event
];
$userFieldsMap = UserField\UserFieldManager::getLinkedUserFieldsMap();
foreach ($settings as $name => $isEnabled)
{
if (isset($userFieldsMap[$name]))
{
UserField\UserFieldManager::enableEntityInUserField(
$userFieldsMap[$name],
$entityTypeName,
$isEnabled === 'true'
);
}
}
Удаление процесса
Удаление смарт-процесса мало чем отличается от удаления объекта ORM: необходимо получить объект процесса и вызвать метод удаления.
/**
* Smart proccess to be deteled
* @var \Bitrix\Crm\Model\Dynamic\Type
*/
$type;
/**
* @var \Bitrix\Main\Result
*/
$deleteResult = $type->delete();
if ( !$deleteResult->isSuccess() )
{
/**
* Some errors when delete $type.
* Get \Bitrix\Main\Errors[] = $deleteResult->getErrors();
* Or get string[] = $deleteResult->getErrorMessages()
*/
}