• Модуль: tasks
  • Путь к файлу: ~/bitrix/modules/tasks/classes/general/taskitem.php
  • Класс: CTaskItem
  • Вызов: CTaskItem::addChildTasksByTemplate
public function addChildTasksByTemplate($templateId, $parameters = array(
	'CHILD_TEMPLATE_DATA' =>	array(),

	'BEFORE_ADD_CALLBACK' =>	null,
	'SPAWNED_BY_AGENT' =>		false
))
{
	$templateId = (int) $templateId;
	if ( ! $templateId )
		return array();	// template id not set

	$taskId = $this->getId();

	// ensure we have access to this task
	try
	{
		$data = $this->getData(false);
	}
	catch (TasksException $e)
	{
		return [];
	}


	if(is_array($data))
	{
		if(!is_array($parameters))
			$parameters = array();

		if(!isset($parameters['BEFORE_ADD_CALLBACK']))
			$parameters['BEFORE_ADD_CALLBACK'] = null;
		if(!isset($parameters['SPAWNED_BY_AGENT']))
			$parameters['SPAWNED_BY_AGENT'] = false;

		// CHILD_TEMPLATE_DATA is used to pass pre-cached data to a function to avoid unnecessary db quires
		if(!is_array($parameters['CHILD_TEMPLATE_DATA']) || empty($parameters['CHILD_TEMPLATE_DATA']))
			$parameters['CHILD_TEMPLATE_DATA'] = $this->getChildTemplateData($templateId);

		$created = array();

		if(!empty($parameters['CHILD_TEMPLATE_DATA']))
		{
			$templateId2TaskId = array($templateId => $taskId);
			$creationOrder = array();
			$walkQueue = array($templateId);
			$treeBundles = array();

			// restruct array to avioid recursion. we should NOT lay on ID values

			foreach($parameters['CHILD_TEMPLATE_DATA'] as $subTemplate)
			{
				$treeBundles[$subTemplate['BASE_TEMPLATE_ID']][] = $subTemplate['ID'];
			}

			while(!empty($walkQueue))
			{
				$topTemplate = array_shift($walkQueue);

				if(is_array($treeBundles[$topTemplate]))
				{
					foreach($treeBundles[$topTemplate] as $parent => $template)
					{
						$walkQueue[] = $template;
						$creationOrder[] = $template;
					}
				}
				unset($treeBundles[$topTemplate]);
			}

			foreach($creationOrder as $subTemplateId)
			{
				$data = $parameters['CHILD_TEMPLATE_DATA'][$subTemplateId];

				if(!intval($templateId2TaskId[$data['BASE_TEMPLATE_ID']])) // smth went wrong previously, skip this branch
					continue;

				$createdTasks = static::addByTemplate($subTemplateId, $this->getExecutiveUserId(), array('PARENT_ID' => $templateId2TaskId[$data['BASE_TEMPLATE_ID']]), array(
					'TEMPLATE_DATA' => $data,
					'CREATE_CHILD_TASKS' =>		false,
					'CREATE_MULTITASK' =>		false,

					'BEFORE_ADD_CALLBACK' =>	$parameters['BEFORE_ADD_CALLBACK'],
					'SPAWNED_BY_AGENT' =>		$parameters['SPAWNED_BY_AGENT'],
				));

				if(is_array($createdTasks) && !empty($createdTasks))
				{
					foreach($createdTasks as $ctId => $ctInst)
						$created[$ctId] = $ctInst;

					$firstTask = array_shift($createdTasks);
					if($firstTask instanceof static)
					{
						$templateId2TaskId[$subTemplateId] = $firstTask->getId(); // get only the first, because it is "main" task
					}
				}
			}
		}

		return $created;
	}
	else
		return array();
}