Работа со Смарт Процессами в модуле CRM Битрикс24
Все взаимодействие с новым API в модуле CRM и смарт-процессами в частности осуществляется посредством взаимодействия с сервисами из контейнера \Bitrix\Crm\Service\Container. Это означает что перед выполнением любой операции необходимо:
- Получить контейнер
- Достать из контейнера нужный сервис
- Выполнить нужное действие
В некоторых случаях можно обойтись без контейнеров, но использование их строго рекомендовано, чтобы обеспечивать возможность наследования и переопределения действий.
Пример получения контейнера для дальнейшей работы:
\Bitrix\Main\Loader::IncludeModule('crm');
// получаем контейнер
$container = \Bitrix\Crm\Service\Container::getInstance();
Получить зарегистрированные Смарт Процессы
Для получения списка смарт-процессов необходимо сначала получить название таблета, с которым можно работать, дальше работа строится как и с любым другим DataManager объектом:
\Bitrix\Main\Loader::IncludeModule('crm');
// получаем контейнер
$container = \Bitrix\Crm\Service\Container::getInstance();
// получаем пространство имен Bitrix\Crm\Model\Dynamic\TypeTable
$typeDataClass = $container->getDynamicTypeDataClass();
// запрос в базу
$listDynamicTypes = $typeDataClass::getList([
'select' => ['*']
]);
// получаем все смарт процессы
var_dump($listDynamicTypes->fetchAll());
Создание и редактирование процесса
При работе с ORM нет отдельных операций на создание и редактирование процесса, вместо этого все это определяется единым методом сохранения и обновлением сопутствующей информации.
Ход сохранения смарт-процесса:
- Получение объекта
\Bitrix\Crm\Model\Dynamic\Type - Изменение полей, сохранение смарт-процесса
- Сохранение конверсионной схемы
- Обновление разрешений для пользовательских полей
- Обновление связей
- Обновление раздела, если выводится в собственном разделе
Рассмотрим пример создания своего смарт-процесса: предположим нам необходимо создать типовой смарт-процесс для хранения NDA (соглашение о неразглашении) со стандартными полями Название, Ответственный, Привязка к задачам. В данном примере мы не будем обновлять связи, не затрагиваем конверсионную карту и не будем обновлять отдельный раздел:
\Bitrix\Main\Loader::IncludeModule('crm');
// получаем контейнер
$container = \Bitrix\Crm\Service\Container::getInstance();
// получаем пространство имен Bitrix\Crm\Model\Dynamic\TypeTable
$typeDataClass = $container->getDynamicTypeDataClass();
// получаем объект \Bitrix\Crm\Model\Dynamic\Type для создания нового Смарт Процесса
$type = $typeDataClass::createObject();
// устанавливаем заголовок
$type->set('TITLE', 'NDA')
// устанавливаем название на латиницы
->set('NAME', 'NDA')
// устанавливаем символьный код
->set('CODE', 'NDA')
// устанавливаем флаг, разрешающий использование пользовательских полей
->set('IS_USE_IN_USERFIELD_ENABLED', 'Y');
// сохраняем Смарт Процесс
$result = $type->save();
// проверка на успешность создания Смарт Процесса
if (!$result->isSuccess()) {
/**
* Get error \Bitrix\Main\Error[] $result->getErrors()
* Get error messages string[] $result->getErrorMessages()
*/
return false;
}
// получим строковый идентификатор типа Смарт Процесса
$entityTypeName = \CCrmOwnerType::ResolveName($type->getEntityTypeId());
// набор полей у которых мы обновим статус
$settings = [
// поля связанные с задачей
'TASKS_TASK|UF_CRM_TASK' => 'true',
// поля связанные с шаблоном задачи
//'TASKS_TASK_TEMPLATE|UF_CRM_TAS' => 'true',
// поля связанные с событием календаря
//'CALENDAR_EVENT|UF_CRM_CAL_EVENT' => 'true',
];
// получим массив пользовательских полей, которые связаны с полями CRM в других модулях
$userFieldsMap = \Bitrix\Crm\UserField\UserFieldManager::getLinkedUserFieldsMap();
foreach ($settings as $name => $isEnabled) {
if (isset($userFieldsMap[$name])) {
// сохраняет новый статус сущности с именем $entityTypeName в настройках пользовательского поля $userFieldsMap в базе данных
\Bitrix\Crm\UserField\UserFieldManager::enableEntityInUserField(
$userFieldsMap[$name],
$entityTypeName,
$isEnabled === 'true'
);
}
}
Удаление процесса
Удаление смарт-процесса мало чем отличается от удаления объекта ORM.
Ход сохранения смарт-процесса:
- Получить объект процесса
- Вызвать метод удаления
\Bitrix\Main\Loader::IncludeModule('crm');
// получаем контейнер
$container = \Bitrix\Crm\Service\Container::getInstance();
// получаем пространство имен Bitrix\Crm\Model\Dynamic\TypeTable
$typeDataClass = $container->getDynamicTypeDataClass();
// запрос в базу с получением одного объекта
$type = $typeDataClass::getList([
'select' => ['*'],
// фильтруем по ID смарт процесса
'filter' => ['=ID' => 7],
])->fetchObject();
// удаляем Смарт Процесс
$result = $type->delete();
// проверка на успешность удаления Смарт Процесса
if (!$result->isSuccess()) {
/**
* Get error \Bitrix\Main\Error[] $result->getErrors()
* Get error messages string[] $result->getErrorMessages()
*/
return false;
}