- Модуль: 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();
}