%PDF- %PDF-
Direktori : /home/bitrix/www/bitrix/activities/bitrix/createdocumentactivity/ |
Current File : /home/bitrix/www/bitrix/activities/bitrix/createdocumentactivity/createdocumentactivity.php |
<? if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die(); class CBPCreateDocumentActivity extends CBPActivity { const EXECUTION_MAX_DEPTH = 1; private static $executionDepth = array(); public function __construct($name) { parent::__construct($name); $this->arProperties = array( "Title" => "", "Fields" => null, ); } public function Execute() { $rootActivity = $this->GetRootActivity(); $documentId = $rootActivity->GetDocumentId(); $fieldValue = $this->Fields; $documentService = $this->workflow->GetService("DocumentService"); $documentFields = $documentService->GetDocumentFields($documentService->GetDocumentType($documentId)); $documentFieldsAliasesMap = CBPDocument::getDocumentFieldsAliasesMap($documentFields); if ($documentFieldsAliasesMap) { $fixedFields = array(); foreach ($fieldValue as $key => $value) { if (!isset($documentFields[$key]) && isset($documentFieldsAliasesMap[$key])) { $fixedFields[$documentFieldsAliasesMap[$key]] = $value; continue; } $fixedFields[$key] = $value; } $fieldValue = $fixedFields; } $executionKey = $rootActivity->GetWorkflowTemplateId(); self::increaseExecutionDepth($executionKey); $documentService->CreateDocument($documentId, $fieldValue); self::resetExecutionDepth($executionKey); return CBPActivityExecutionStatus::Closed; } public static function GetPropertiesDialog($documentType, $activityName, $arWorkflowTemplate, $arWorkflowParameters, $arWorkflowVariables, $arCurrentValues = null, $formName = "", $popupWindow = null) { $runtime = CBPRuntime::GetRuntime(); if (!is_array($arWorkflowParameters)) $arWorkflowParameters = array(); if (!is_array($arWorkflowVariables)) $arWorkflowVariables = array(); /** @var CBPDocumentService $documentService */ $documentService = $runtime->GetService("DocumentService"); $arDocumentFieldsTmp = $documentService->GetDocumentFields($documentType); $documentFieldsAliasesMap = CBPDocument::getDocumentFieldsAliasesMap($arDocumentFieldsTmp); $arFieldTypes = $documentService->GetDocumentFieldTypes($documentType); if (!is_array($arCurrentValues)) { $arCurrentValues = array(); $arCurrentActivity = &CBPWorkflowTemplateLoader::FindActivityByName($arWorkflowTemplate, $activityName); if (is_array($arCurrentActivity["Properties"]) && array_key_exists("Fields", $arCurrentActivity["Properties"]) && is_array($arCurrentActivity["Properties"]["Fields"])) { foreach ($arCurrentActivity["Properties"]["Fields"] as $k => $v) { if (!isset($arDocumentFieldsTmp[$k]) && isset($documentFieldsAliasesMap[$k])) $k = $documentFieldsAliasesMap[$k]; $arCurrentValues[$k] = $v; if ($arDocumentFieldsTmp[$k]["BaseType"] == "user") { if (!is_array($arCurrentValues[$k])) $arCurrentValues[$k] = array($arCurrentValues[$k]); $ar = array(); foreach ($arCurrentValues[$k] as $v) { if (intval($v)."!" == $v."!") $v = "user_".$v; $ar[] = $v; } $arCurrentValues[$k] = CBPHelper::UsersArrayToString($ar, $arWorkflowTemplate, $documentType); } } } } else { foreach ($arDocumentFieldsTmp as $key => $value) { if (!$value["Editable"]) continue; $arErrors = array(); $arCurrentValues[$key] = $documentService->GetFieldInputValue($documentType, $value, $key, $arCurrentValues, $arErrors); } } $arDocumentFields = array(); $defaultFieldValue = ""; foreach ($arDocumentFieldsTmp as $key => $value) { if (!$value["Editable"]) continue; $arDocumentFields[$key] = $value; if (strlen($defaultFieldValue) <= 0) $defaultFieldValue = $key; /*if ($value["BaseType"] == "select" || $value["BaseType"] == "bool") { if (array_key_exists($key."_text", $arCurrentValues) && ($value["Multiple"] && count($arCurrentValues[$key."_text"]) > 0 || !$value["Multiple"] && strlen($arCurrentValues[$key."_text"]) > 0) ) { $arCurrentValues[$key] = $arCurrentValues[$key."_text"]; } }*/ } $javascriptFunctions = $documentService->GetJSFunctionsForFields($documentType, "objFieldsCD", $arDocumentFields, $arFieldTypes); return $runtime->ExecuteResourceFile( __FILE__, "properties_dialog.php", array( "arCurrentValues" => $arCurrentValues, "arDocumentFields" => $arDocumentFields, "formName" => $formName, "defaultFieldValue" => $defaultFieldValue, "arFieldTypes" => $arFieldTypes, "javascriptFunctions" => $javascriptFunctions, "documentType" => $documentType, "popupWindow" => &$popupWindow, ) ); } public static function GetPropertiesDialogValues($documentType, $activityName, &$arWorkflowTemplate, &$arWorkflowParameters, &$arWorkflowVariables, $arCurrentValues, &$arErrors) { $arErrors = array(); $runtime = CBPRuntime::GetRuntime(); $arProperties = array("Fields" => array()); $documentService = $runtime->GetService("DocumentService"); $arDocumentFields = $documentService->GetDocumentFields($documentType); foreach ($arDocumentFields as $fieldKey => $fieldValue) { if (!$fieldValue["Editable"]) continue; $arFieldErrors = array(); $r = $documentService->GetFieldInputValue($documentType, $fieldValue, $fieldKey, $arCurrentValues, $arFieldErrors); if(is_array($arFieldErrors) && !empty($arFieldErrors)) { $arErrors = array_merge($arErrors, $arFieldErrors); } if ($fieldValue["BaseType"] == "user") { if ($r === "author") { //HACK: We can't resolve author for new document - setup target user as author. $r = "{=Template:TargetUser}"; } elseif (is_array($r)) { $qty = count($r); if ($qty == 0) { $r = null; } elseif ($qty == 1) { $r = $r[0]; } } } if ($fieldValue["Required"] && ($r == null)) { $arErrors[] = array( "code" => "emptyRequiredField", "message" => str_replace("#FIELD#", $fieldValue["Name"], GetMessage("BPCDA_FIELD_REQUIED")), ); } if ($r != null) $arProperties["Fields"][$fieldKey] = $r; } if (count($arErrors) > 0) return false; $arCurrentActivity = &CBPWorkflowTemplateLoader::FindActivityByName($arWorkflowTemplate, $activityName); $arCurrentActivity["Properties"] = $arProperties; return true; } private static function increaseExecutionDepth($key) { if (!isset(self::$executionDepth[$key])) { self::$executionDepth[$key] = 0; } self::$executionDepth[$key]++; if (self::$executionDepth[$key] > self::EXECUTION_MAX_DEPTH) throw new Exception(GetMessage('BPCDA_RECURSION_ERROR')); } private static function resetExecutionDepth($key) { self::$executionDepth[$key] = 0; } }