$arData["AUDITORS"] = $arData["~AUDITORS"] ? unserialize($arData["~AUDITORS"]) : array(); $arData["RESPONSIBLES"] = $arData["~RESPONSIBLES"] ? unserialize($arData["~RESPONSIBLES"]) : array(); $arData["FILES"] = $arData["~FILES"] ? unserialize($arData["~FILES"]) : array(); $arData["TAGS"] = $arData["~TAGS"] ? unserialize($arData["~TAGS"]) : ""; $arData["DEPENDS_ON"] = $arData["~DEPENDS_ON"] ? unserialize($arData["~DEPENDS_ON"]) : array(); $arData["DESCRIPTION"] = $arData["~DESCRIPTION"]; $arData["CREATED_BY_NAME"] = $arData["~CREATED_BY_NAME"]; $arData["CREATED_BY_LAST_NAME"] = $arData["~CREATED_BY_LAST_NAME"]; $arData["CREATED_BY_SECOND_NAME"] = $arData["~CREATED_BY_SECOND_NAME"]; $arData["CREATED_BY_LOGIN"] = $arData["~CREATED_BY_LOGIN"]; $arData["DEADLINE_AFTER"] = $arData["~DEADLINE_AFTER"] / (24 * 60 * 60); $arData["REPLICATE_PARAMS"] = unserialize($arData["~REPLICATE_PARAMS"]); $arReplicateParams = array("REPLICATE_PERIOD" => $arData["REPLICATE_PARAMS"]["PERIOD"], "REPLICATE_EVERY_DAY" => $arData["REPLICATE_PARAMS"]["EVERY_DAY"], "REPLICATE_WORKDAY_ONLY" => $arData["REPLICATE_PARAMS"]["WORKDAY_ONLY"], "REPLICATE_EVERY_WEEK" => $arData["REPLICATE_PARAMS"]["EVERY_WEEK"], "REPLICATE_WEEK_DAYS" => $arData["REPLICATE_PARAMS"]["WEEK_DAYS"], "REPLICATE_MONTHLY_TYPE" => $arData["REPLICATE_PARAMS"]["MONTHLY_TYPE"], "REPLICATE_MONTHLY_DAY_NUM" => $arData["REPLICATE_PARAMS"]["MONTHLY_DAY_NUM"], "REPLICATE_MONTHLY_MONTH_NUM_1" => $arData["REPLICATE_PARAMS"]["MONTHLY_MONTH_NUM_1"], "REPLICATE_MONTHLY_WEEK_DAY_NUM" => $arData["REPLICATE_PARAMS"]["MONTHLY_WEEK_DAY_NUM"], "REPLICATE_MONTHLY_WEEK_DAY" => $arData["REPLICATE_PARAMS"]["MONTHLY_WEEK_DAY"], "REPLICATE_MONTHLY_MONTH_NUM_2" => $arData["REPLICATE_PARAMS"]["MONTHLY_MONTH_NUM_2"], "REPLICATE_YEARLY_TYPE" => $arData["REPLICATE_PARAMS"]["YEARLY_TYPE"], "REPLICATE_YEARLY_DAY_NUM" => $arData["REPLICATE_PARAMS"]["YEARLY_DAY_NUM"], "REPLICATE_YEARLY_MONTH_1" => $arData["REPLICATE_PARAMS"]["YEARLY_MONTH_1"], "REPLICATE_YEARLY_WEEK_DAY_NUM" => $arData["REPLICATE_PARAMS"]["YEARLY_WEEK_DAY_NUM"], "REPLICATE_YEARLY_WEEK_DAY" => $arData["REPLICATE_PARAMS"]["YEARLY_WEEK_DAY"], "REPLICATE_YEARLY_MONTH_2" => $arData["REPLICATE_PARAMS"]["YEARLY_MONTH_2"], "REPLICATE_START_DATE" => $arData["REPLICATE_PARAMS"]["START_DATE"], "REPLICATE_END_DATE" => $arData["REPLICATE_PARAMS"]["END_DATE"]); // check list $arData['CHECKLIST_ITEMS'] = array(); $res = \Bitrix\Tasks\Template\CheckListItemTable::getList(array('filter' => array('=TEMPLATE_ID' => $arParams["TEMPLATE_ID"]), 'order' => array('SORT' => 'asc'), 'select' => array('ID', 'TITLE', 'CHECKED', 'IS_COMPLETE'))); while ($item = $res->fetch()) { $arData['CHECKLIST_ITEMS'][$item['ID']] = $item; } $arData = array_merge($arData, $arReplicateParams); } } else { $arData["PRIORITY"] = 1; } // read existed user fileds $arResult["USER_FIELDS"] = $GLOBALS["USER_FIELD_MANAGER"]->GetUserFields("TASKS_TASK_TEMPLATE", $arParams["TEMPLATE_ID"] ? $arParams["TEMPLATE_ID"] : 0, LANGUAGE_ID); //Form submitted if ($_SERVER["REQUEST_METHOD"] == "POST" && check_bitrix_sessid() && ($arResult["ACTION"] == "create" || $arResult["ACTION"] == "edit") && !isset($_POST['controller_id'])) { $_POST["WEEK_DAYS"] = explode(",", $_POST["WEEK_DAYS"]); if (isset($_POST["save"]) || isset($_POST["apply"])) { $_POST["TAGS"] = array_filter(explode(",", $_POST["TAGS"]));
/** * Create a task by a template. * * @param integer $templateId - Id of task template. * @param integer $executiveUserId User id. Put 1 here to skip rights. * @param mixed[] $overrideTaskData Task data needs to be overrided externally. * @param mixed[] $parameters Various set of parameters. * * <li> TEMPLATE_DATA mixed[] pre-cached data, if available we can get rid of additional queries * <li> CREATE_CHILD_TASKS boolean if false, sub-tasks wont be created * <li> CREATE_MULTITASK boolean if false, discards template rule of "copying task to several responsibles" * <li> BEFORE_ADD_CALLBACK callable callback called before each task added, allows to modify data passed to CTaskItem::add() * * @throws TasksException - on access denied, task not found * @throws CTaskAssertException * @throws Exception - on unexpected error * * @return CTaskItem[] */ public static function addByTemplate($templateId, $executiveUserId, $overrideTaskData = array(), $parameters = array('TEMPLATE_DATA' => array(), 'CREATE_CHILD_TASKS' => true, 'CREATE_MULTITASK' => true, 'BEFORE_ADD_CALLBACK' => null, 'SPAWNED_BY_AGENT' => false)) { CTaskAssert::assertLaxIntegers($executiveUserId); CTaskAssert::assert($executiveUserId > 0); global $DB; $templateId = (int) $templateId; if (!$templateId) { return array(); // template id not set } if (!is_array($overrideTaskData)) { $overrideTaskData = array(); } if (!is_array($parameters)) { $parameters = array(); } if (!isset($parameters['CREATE_CHILD_TASKS'])) { $parameters['CREATE_CHILD_TASKS'] = true; } if (!isset($parameters['CREATE_MULTITASK'])) { $parameters['CREATE_MULTITASK'] = true; } if (!isset($parameters['BEFORE_ADD_CALLBACK'])) { $parameters['BEFORE_ADD_CALLBACK'] = null; } if (!isset($parameters['SPAWNED_BY_AGENT'])) { $parameters['SPAWNED_BY_AGENT'] = false; } // read template data if (is_array($parameters['TEMPLATE_DATA']) && !empty($parameters['TEMPLATE_DATA'])) { $arTemplate = $parameters['TEMPLATE_DATA']; } else { $arFilter = array('ID' => $templateId); $rsTemplate = CTaskTemplates::GetList(array(), $arFilter); $arTemplate = $rsTemplate->Fetch(); if (!$arTemplate) { return array(); // nothing to do } } $arTemplate = array_merge($arTemplate, $overrideTaskData); if (!isset($arTemplate['CHECK_LIST'])) { // get template checklist $arTemplate['CHECK_LIST'] = array(); $res = \Bitrix\Tasks\Template\CheckListItemTable::getList(array('filter' => array('TEMPLATE_ID' => $templateId), 'select' => array('IS_COMPLETE', 'SORT_INDEX', 'TITLE'))); while ($item = $res->fetch()) { $arTemplate['CHECK_LIST'][] = $item; } } ////////////////////////////////////////////// ////////////////////////////////////////////// ////////////////////////////////////////////// unset($arTemplate['STATUS']); $arFields = $arTemplate; $arFields['CREATED_DATE'] = date($DB->DateFormatToPHP(CSite::GetDateFormat('FULL')), time() + CTimeZone::GetOffset()); $arFields['ACCOMPLICES'] = unserialize($arFields['ACCOMPLICES']); $arFields['AUDITORS'] = unserialize($arFields['AUDITORS']); $arFields['TAGS'] = unserialize($arFields['TAGS']); $arFields['FILES'] = unserialize($arFields['FILES']); $arFields['DEPENDS_ON'] = unserialize($arFields['DEPENDS_ON']); $arFields['REPLICATE'] = 'N'; $arFields['CHANGED_BY'] = $arFields['CREATED_BY']; $arFields['CHANGED_DATE'] = $arFields['CREATED_DATE']; if (!$arFields['ACCOMPLICES']) { $arFields['ACCOMPLICES'] = array(); } if (!$arFields['AUDITORS']) { $arFields['AUDITORS'] = array(); } unset($arFields['ID'], $arFields['REPLICATE'], $arFields['REPLICATE_PARAMS']); if ($arTemplate['DEADLINE_AFTER']) { $deadlineAfter = $arTemplate['DEADLINE_AFTER'] / (24 * 60 * 60); $deadline = strtotime(date('Y-m-d 00:00') . ' +' . $deadlineAfter . ' days'); $arFields['DEADLINE'] = date($DB->DateFormatToPHP(CSite::GetDateFormat('SHORT')), $deadline); } $multitaskMode = false; if ($parameters['CREATE_MULTITASK']) { $arFields['RESPONSIBLES'] = unserialize($arFields['RESPONSIBLES']); // copy task to multiple responsibles if ($arFields['MULTITASK'] == 'Y' && !empty($arFields['RESPONSIBLES'])) { $arFields['RESPONSIBLE_ID'] = $arFields['CREATED_BY']; $multitaskMode = true; } else { $arFields['RESPONSIBLES'] = array(); } } else { $arFields['MULTITASK'] = 'N'; $arFields['RESPONSIBLES'] = array(); } $arFields['FORKED_BY_TEMPLATE_ID'] = $templateId; // add main task to the create list $tasksToCreate = array($arFields); // if MULTITASK where set to Y, create a duplicate task for each of RESPONSIBLES if (!empty($arFields['RESPONSIBLES'])) { $arFields['MULTITASK'] = 'N'; foreach ($arFields['RESPONSIBLES'] as $responsible) { $arFields['RESPONSIBLE_ID'] = $responsible; $tasksToCreate[] = $arFields; } } // get sub-templates $subTasksToCreate = array(); if ($parameters['CREATE_CHILD_TASKS'] !== false) { $subTasksToCreate = static::getChildTemplateData($templateId); } $created = array(); // first, create ROOT tasks $multitaskTaskId = false; $i = 0; foreach ($tasksToCreate as $arFields) { if ($multitaskMode && $i > 0) { if ($multitaskTaskId) { // all following tasks will be subtasks of a base task in case of MULTITASK was turned on $arFields['PARENT_ID'] = $multitaskTaskId; } else { break; // no child tasks will be created, because parent task failed to be created } } $add = true; if (is_callable($parameters['BEFORE_ADD_CALLBACK'])) { $result = call_user_func_array($parameters['BEFORE_ADD_CALLBACK'], array(&$arFields)); if ($result === false) { $add = false; } } if ($add) { // temporary commented out, because there is currently no way to pass // 'SPAWNED_BY_AGENT' => true // parameter to CTaskTemplate::add() : //$taskInstance = static::add($arFields, $executiveUserId); //$taskId = $taskInstance->getId(); $task = new CTasks(); $taskId = $task->Add($arFields, array('SPAWNED_BY_AGENT' => !!$parameters['SPAWNED_BY_AGENT'], 'USER_ID' => $executiveUserId)); if (intval($taskId)) { $taskInstance = static::getInstance($taskId, $executiveUserId); // the first task should be mom in case of multitasking if ($multitaskMode && $i == 0) { $multitaskTaskId = $taskId; } // check list items for root task foreach ($arTemplate['CHECK_LIST'] as $item) { CTaskCheckListItem::add($taskInstance, $item); } $created[$taskId] = $taskInstance; if (!empty($subTasksToCreate)) { $notifADWasDisabled = CTaskNotifications::disableAutoDeliver(); $createdSubtasks = $taskInstance->addChildTasksByTemplate($templateId, array('CHILD_TEMPLATE_DATA' => $subTasksToCreate, 'BEFORE_ADD_CALLBACK' => $parameters['BEFORE_ADD_CALLBACK'], 'SPAWNED_BY_AGENT' => $parameters['SPAWNED_BY_AGENT'])); if ($notifADWasDisabled) { CTaskNotifications::enableAutoDeliver(); } if (is_array($createdSubtasks) && !empty($createdSubtasks)) { foreach ($createdSubtasks as $ctId => $ctInst) { $created[$ctId] = $ctInst; } } } } } $i++; } return $created; }
$arTemplate["FILES"][$key] = $newFile; } } } $arTemplate["REPLICATE_PARAMS"] = unserialize($arTemplate["~REPLICATE_PARAMS"]); if (is_array($arTemplate["REPLICATE_PARAMS"])) { foreach ($arTemplate["REPLICATE_PARAMS"] as $field => $value) { $arTemplate["REPLICATE_" . $field] = $value; } } if ($arTemplate["DEADLINE_AFTER"]) { $deadlineAfter = $arTemplate["DEADLINE_AFTER"] / (24 * 60 * 60); $arTemplate["DEADLINE"] = date($DB->DateFormatToPHP(CSite::GetDateFormat("SHORT")), strtotime(date("Y-m-d 00:00") . " +" . $deadlineAfter . " days")); } // check list items $res = \Bitrix\Tasks\Template\CheckListItemTable::getList(array('filter' => array('=TEMPLATE_ID' => intval($_GET["TEMPLATE"])), 'select' => array('ID', 'TITLE', 'SORT', 'IS_COMPLETE'), 'order' => array('SORT' => 'asc'))); while ($item = $res->fetch()) { unset($item['ID']); $arTemplate['CHECKLIST_ITEMS'][] = $item; } $arResult['COPY_PARAMS']['ORIGIN_TEMPLATE'] = intval($_GET["TEMPLATE"]); // get template.php to know task being copied $arData = $arTemplate; $arData['REPLICATE'] = 'N'; $arData['~REPLICATE'] = 'N'; $arData['REPLICATE_PARAMS'] = array(); $arData['~REPLICATE_PARAMS'] = array(); foreach ($arData as $key => $value) { if (substr($key, 0, 10) === 'REPLICATE_') { unset($arData[$key]); }