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