- Модуль: tasks
- Путь к файлу: ~/bitrix/modules/tasks/classes/general/taskitem.php
- Класс: CTaskItem
- Вызов: CTaskItem::duplicate
public function duplicate($overrideTaskData = array(), $parameters = array(
'CLONE_CHILD_TASKS' => true,
'CLONE_CHECKLIST_ITEMS' => true,
'CLONE_TAGS' => true,
'CLONE_REMINDERS' => true,
'CLONE_TASK_DEPENDENCY' => true,
'CLONE_FILES' => true
))
{
if(!is_array($overrideTaskData))
$overrideTaskData = array();
if(!is_array($parameters))
$parameters = array();
if(!isset($parameters['CLONE_CHILD_TASKS']))
$parameters['CLONE_CHILD_TASKS'] = true;
if(!isset($parameters['CLONE_CHECKLIST_ITEMS']))
$parameters['CLONE_CHECKLIST_ITEMS'] = true;
if(!isset($parameters['CLONE_TAGS']))
$parameters['CLONE_TAGS'] = true;
if(!isset($parameters['CLONE_REMINDERS']))
$parameters['CLONE_REMINDERS'] = true;
if(!isset($parameters['CLONE_TASK_DEPENDENCY']))
$parameters['CLONE_TASK_DEPENDENCY'] = true;
if(!isset($parameters['CLONE_FILES']))
$parameters['CLONE_FILES'] = true;
$result = array();
try
{
$data = $this->getData(false); // ensure we have access to the task
}
catch(TasksException $e)
{
return $result;
}
if (!is_array($data))
{
return $result;
}
$data = array_merge($data, $overrideTaskData);
unset(
// drop unwanted
$data['ID'],
$data['GUID'],
$data['STATUS'],
$data['CHANGED_BY'],
// detach forum, if any
$data['FORUM_TOPIC_ID'],
$data['COMMENTS_COUNT'],
// clean dates
$data['CREATED_DATE'],
$data['CHANGED_DATE'],
$data['VIEWED_DATE'],
$data['STATUS_CHANGED_DATE'],
$data['ACTIVITY_DATE']
);
$files = array();
if(is_array($data['UF_TASK_WEBDAV_FILES']) && !empty($data['UF_TASK_WEBDAV_FILES']))
{
$files = $data['UF_TASK_WEBDAV_FILES'];
}
unset($data['UF_TASK_WEBDAV_FILES']);
$taskDupId = 0;
try
{
$clone = static::add($data, $this->getExecutiveUserId());
$taskDupId = $clone->getId();
}
catch(Exception $e)
{
}
if(intval($taskDupId))
{
$result[$clone->getId()] = $clone;
if($parameters['CLONE_CHECKLIST_ITEMS'])
{
[$arChecklistItems, $arMetaData] = CTaskCheckListItem::fetchList($this, array('SORT_INDEX' => 'ASC'));
unset($arMetaData);
foreach ($arChecklistItems as $oChecklistItem)
{
$cliData = $oChecklistItem->getData();
$cliCloneData = array(
'TITLE' => $cliData['TITLE'],
'IS_COMPLETE' => $cliData['IS_COMPLETE'],
'SORT_INDEX' => $cliData['SORT_INDEX']
);
CTaskCheckListItem::add($clone, $cliCloneData);
}
}
if($parameters['CLONE_TAGS'])
{
$tags = $this->getTags();
if(is_array($tags))
{
foreach($tags as $tag)
{
if((string) $tag != '')
{
$oTag = new CTaskTags();
$oTag->Add(array(
'TASK_ID' => $taskDupId,
'NAME' => $tag
), $this->getExecutiveUserId());
}
}
}
}
if($parameters['CLONE_REMINDERS'])
{
$res = CTaskReminders::GetList(false, array('TASK_ID' => $this->getId()));
while($item = $res->fetch())
{
$item['TASK_ID'] = $taskDupId;
$item['USER_ID'] = $this->getExecutiveUserId();
$oReminder = new CTaskReminders();
$oReminder->Add($item);
}
}
if($parameters['CLONE_TASK_DEPENDENCY'])
{
$res = CTaskDependence::GetList(array(), array('TASK_ID' => $this->getId()));
while($item = $res->fetch())
{
$depInstance = new CTaskDependence();
if(is_array($item))
{
$depInstance->Add(array(
'TASK_ID' => $taskDupId,
'DEPENDS_ON_ID' => $item['DEPENDS_ON_ID']
));
}
}
}
if($parameters['CLONE_FILES'] && !empty($files) && BitrixMainLoader::includeModule('disk'))
{
// find which files are new and which are old
$old = array();
$new = array();
foreach($files as $fileId)
{
if((string) $fileId)
{
if(mb_strpos($fileId, 'n') === 0)
$new[] = $fileId;
else
$old[] = $fileId;
}
}
if(!empty($old))
{
$userFieldManager = BitrixDiskDriver::getInstance()->getUserFieldManager();
$old = $userFieldManager->cloneUfValuesFromAttachedObject($old, $this->getExecutiveUserId());
if(is_array($old) && !empty($old))
{
$new = array_merge($new, $old);
}
}
if(!empty($new))
$clone->update(array('UF_TASK_WEBDAV_FILES' => $new));
}
if($parameters['CLONE_CHILD_TASKS'])
{
$notifADWasDisabled = CTaskNotifications::disableAutoDeliver();
$clones = $this->duplicateChildTasks($clone);
if(is_array($clones))
{
foreach($clones as $cId => $cInst)
$result[$cId] = $cInst;
}
if($notifADWasDisabled)
{
CTaskNotifications::enableAutoDeliver();
}
}
}
return $result;
}