• Модуль: tasks
  • Путь к файлу: ~/bitrix/modules/tasks/lib/util/replicator/task/fromtask.php
  • Класс: BitrixTasksUtilReplicatorTaskFromTask
  • Вызов: FromTask::getSubItemData
private function getSubItemData($id, Result $result, $userId = 0)
{
	$queue = array($id);
	$met = array();
	$times = 0;

	$data = array();
	$flatTree = array();

	$select = array_keys(BitrixTasksUtilUserFieldTask::getScheme(0, $userId));
	$select[] = '*';

	$parameters = Runtime::apply(
		array(
			'filter' => array(
				'=PARENT_ID' => $id,
			),
			'select' => $select,
		),
		array(RunTimeTask::getAccessCheck(array( // have to check rights...
			'USER_ID' => $userId
		)))
	);

	// todo: use BitrixTasksInternalsHelperTaskDependence here, instead of recursive calls
	// todo: or you can use BitrixTasksItemTask::find() with an appropriate runtime mixin applied on top
	while(!empty($queue))
	{
		if($times > 10000)
		{
			$result->addError('ILLEGAL_STRUCTURE.DEPTH', 'Insane iteration count faced');
			break;
		}

		$nextId = array_shift($queue);
		if(array_key_exists($nextId, $met))
		{
			$result->addError('ILLEGAL_STRUCTURE.LOOP', Loc::getMessage('TASKS_REPLICATOR_SUBTREE_LOOP'));
			break;
		}
		$met[$nextId] = true;

		$parameters['filter']['=PARENT_ID'] = $nextId;

		$res = TaskTable::getList(Runtime::cloneFields($parameters));
		while($item = $res->fetch())
		{
			$data[$item['ID']] = $item;
			$flatTree[$item['ID']] = $nextId;

			$queue[] = $item['ID'];
		}

		$times++;
	}

	if($result->isSuccess())
	{
		$ids = array_keys($data);

		// get checklist data
//			$res = CheckListTable::getList(array('filter' => array('=TASK_ID' => $ids)));
//			while($item = $res->fetch())
//			{
//				if(array_key_exists($item['TASK_ID'], $data))
//				{
//					$data[$item['TASK_ID']]['SE_CHECKLIST'][] = $item;
//				}
//			}

		// get member data
		$res = MemberTable::getList(array('filter' => array('=TASK_ID' => $ids, '=TYPE' => array('A', 'U'))));
		while($item = $res->fetch())
		{
			if(array_key_exists($item['TASK_ID'], $data))
			{
				$data[$item['TASK_ID']][$item['TYPE'] == 'A' ? 'ACCOMPLICES' : 'AUDITORS'][] = $item['USER_ID'];
			}
		}

		// get tag data
		$res = LabelTable::getList([
			'select' => [
				'*',
				'TASK_' => 'TASKS'
			],
			'filter' => [
				'=TASK_ID' => $ids,
			],
		]);

		while($item = $res->fetch())
		{
			if(array_key_exists($item['TASK_ID'], $data))
			{
				$data[$item['TASK_ID']]['TAGS'][] = $item['NAME'];
			}
		}

		// get depends on data
		$res = RelatedTable::getList(array('filter' => array('=TASK_ID' => $ids)));
		while($item = $res->fetch())
		{
			if(array_key_exists($item['TASK_ID'], $data))
			{
				$data[$item['TASK_ID']]['DEPENDS_ON'][] = $item['DEPENDS_ON_ID'];
			}
		}

		foreach ($ids as $taskId)
		{
			$data[$taskId] = array_merge($data[$taskId], $this->processDates($data[$taskId]));
		}
	}

	return array(
		'DATA' => $data,
		'TREE' => $flatTree,
	);
}