Доброго времени суток!
Нигде не встречал, чтобы клиенты создавали свои Activity (Действия) для бизнес-процессов. Думаю, что это связано с отсутствием соответствующей документации.
В данной статье постараюсь пошагово описать процесс создания своего Activity на примере действия, которое будет писать в лог БП или текстовый файл, произвольные значения из шаблона бизнес-процесса.
[spoiler]
1. Создаём структуру файлов будущего Activity.

Хочу сразу отметить, что название папки с Activity должно совпадать с именем файла, в котором находится класс с Activity, в данном случае файл называется write2logactivity.php
Описание будущего действия находится в файле .description.php, его содержимое:
В визуальном редакторе получаем своё действие:

Далее программируем форму настроек действия. Код формы находится в файле properties_dialog.php:
В результате на экране получим:

В зависимости от положения галочки "Писать файл", вывод мы получим или в логе БП:

либо в файле:

Теперь несколько моментов, на которые надо обратить внимание разработчикам.
2. Формирование переменных для диалога настроек, в т.ч. и текущие настройки, а данном случае вся информация будет доступна в массиве $arCurrentValues:
3. Сохранение настроек, сделанных в диалоге настройки действия:
4. Выполняем проверку полученных значений, если требуется выводим ошибку:
Вот в общем и всё, труднее было начать, чем сделать.
Исходный код разработанного Activity можно скачать тут (cp1251)
Спасибо за внимание.
Нигде не встречал, чтобы клиенты создавали свои Activity (Действия) для бизнес-процессов. Думаю, что это связано с отсутствием соответствующей документации.
В данной статье постараюсь пошагово описать процесс создания своего Activity на примере действия, которое будет писать в лог БП или текстовый файл, произвольные значения из шаблона бизнес-процесса.
[spoiler]
1. Создаём структуру файлов будущего Activity.

Хочу сразу отметить, что название папки с Activity должно совпадать с именем файла, в котором находится класс с Activity, в данном случае файл называется write2logactivity.php
Описание будущего действия находится в файле .description.php, его содержимое:
<?
if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die();
$arActivityDescription = array(
"NAME" => GetMessage("BPDDA_DESCR_NAME"),
"DESCRIPTION" => GetMessage("BPDDA_DESCR_DESCR"),
"TYPE" => "activity", // Тип - действие
"CLASS" => "Write2LogActivity", //Класс с Activity
"JSCLASS" => "BizProcActivity", //Стандартная JS библиотека, которая будет рисовать
Activity "CATEGORY" => array(
"ID" => "other", // Activity будет располагаться в категории "Прочее"
),
);
?> |

Далее программируем форму настроек действия. Код формы находится в файле properties_dialog.php:
................................................................................................................
<script>
<?
foreach ($arCurrentValues["MapFields"] as $fieldKey => $documentFieldValue)
{
?>
AddCondition('<?= CUtil::JSEscape($fieldKey) ?>', '<?= CUtil::JSEscape($documentFieldValue) ?>');
<?
}
if (count($arCurrentValues) <= 0)
{
?>AddCondition("", "");<?
}
?>
var check = '<?= $arCurrentValues["write2file"];?>';
if (check == "Y")
{
document.getElementById("write2file").checked = "checked";
Write2File();
}
</script>
................................................................................................................
|
В результате на экране получим:

В зависимости от положения галочки "Писать файл", вывод мы получим или в логе БП:

либо в файле:

Теперь несколько моментов, на которые надо обратить внимание разработчикам.
- Файл write2logactivity.php:
class CBPWrite2LogActivity
extends CBPActivity
{
public function __construct($name)
{
parent::__construct($name);
$this->arProperties = array(
"Title" => "",
"MapFields" => null,
"write2file" => null,
"path2file"=> null
);
} |
public static function GetPropertiesDialog($documentType, $activityName, $arWorkflowTemplate, $arWorkflowParameters, $arWorkflowVariables, $arCurrentValues = null, $formName = "")
{
$runtime = CBPRuntime::GetRuntime();
if (!is_array($arCurrentValues))
{
$arCurrentValues = array();
$arCurrentActivity = &CBPWorkflowTemplateLoader::FindActivityByName($arWorkflowTemplate, $activityName);
...............................
}
$runtime = CBPRuntime::GetRuntime();
return $runtime->ExecuteResourceFile(
__FILE__,
"properties_dialog.php",
array(
"arCurrentValues" => $arCurrentValues,
"formName" => $formName,
)
);
}
|
public static function GetPropertiesDialogValues($documentType, $activityName, &$arWorkflowTemplate, &$arWorkflowParameters, &$arWorkflowVariables, $arCurrentValues, &$arErrors)
{
$runtime = CBPRuntime::GetRuntime();
$arProperties = array("MapFields" => array());
//Получили массив значений $arCurrentValues
if (is_array($arCurrentValues) && count($arCurrentValues)>0)
{
........................
$arProperties ["write2file"] = $arCurrentValues["write2file"] == "Y" ? "Y" : "N";
$arProperties ["path2file"] = $arCurrentValues["path2file"];
}
//Получаем переменные текущего действия по ссылке и заменяем их
$arCurrentActivity = &CBPWorkflowTemplateLoader::FindActivityByName($arWorkflowTemplate, $activityName);
$arCurrentActivity["Properties"] = $arProperties;
return true;
}
|
public static function ValidateProperties($arTestProperties = array(), CBPWorkflowTemplateUser $user = null)
{
$arErrors = array();
$path = "";
if ($arTestProperties["path2file"])
{
$path = $_SERVER["DOCUMENT_ROOT"].$arTestProperties["path2file"];
if (!file_exists($path) && !is_writable(GetDirPath($path)))
$arErrors[] = array("code" => "DirNotWritable", "parameter" => "path2file", "message" => GetMessage("DIR_NOT_WRITABLE"));
if (file_exists($path) && !!is_writable(GetDirPath($path)))
$arErrors[] = array("code" => "FileNotWritable", "parameter" => "path2file", "message" => GetMessage("FILE_NOT_WRITABLE"));
}
return array_merge($arErrors, parent::ValidateProperties($arTestProperties, $user));
} |
Вот в общем и всё, труднее было начать, чем сделать.
Исходный код разработанного Activity можно скачать тут (cp1251)
Спасибо за внимание.