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