- Модуль: tasks
- Путь к файлу: ~/bitrix/modules/tasks/lib/internals/task/sorting.php
- Класс: BitrixTasksInternalsTaskSortingTable
- Вызов: SortingTable::moveTaskToTarget
static function moveTaskToTarget($userId, $groupId, $sourceId, $targetTask, $before)
{
if (!$targetTask)
{
return false;
}
if (($before && $targetTask["PREV_TASK_ID"] == $sourceId) ||
(!$before && $targetTask["NEXT_TASK_ID"] == $sourceId))
{
return true;
}
$prevTask = null;
$prevTaskId = 0;
$prevTaskSort = 0;
$nextTask = null;
$nextTaskId = 0;
$nextTaskSort = 0;
if ($before)
{
$prevTaskId = intval($targetTask["PREV_TASK_ID"]);
if ($prevTaskId)
{
$prevTask = static::getTask($prevTaskId, $userId, $groupId);
if (!$prevTask || $prevTask["SORT"] > $targetTask["SORT"])
{
//try to correct wrong prev_task_id
$filter = $groupId ? array("=GROUP_ID" => $groupId) : array("=USER_ID" => $userId);
$filter[" $filter,
"order" => array("SORT" => "DESC")
));
}
$prevTaskId = $prevTask ? $prevTask["TASK_ID"] : 0;
$prevTaskSort = $prevTask ? $prevTask["SORT"] : 0;
}
$nextTask = $targetTask;
$nextTaskId = $targetTask["TASK_ID"];
$nextTaskSort = $targetTask["SORT"];
}
else
{
$nextTaskId = intval($targetTask["NEXT_TASK_ID"]);
if ($nextTaskId)
{
$nextTask = static::getTask($nextTaskId, $userId, $groupId);
if (!$nextTask || $nextTask["SORT"] < $targetTask["SORT"])
{
//try to correct wrong next_task_id
$filter = $groupId ? array("=GROUP_ID" => $groupId) : array("=USER_ID" => $userId);
$filter[">SORT"] = $targetTask["SORT"];
$nextTask = static::getRow(array(
"filter" => $filter,
"order" => array("SORT" => "ASC")
));
}
$nextTaskId = $nextTask ? $nextTask["TASK_ID"] : 0;
$nextTaskSort = $nextTask ? $nextTask["SORT"] : 0;
}
$prevTask = $targetTask;
$prevTaskId = $targetTask["TASK_ID"];
$prevTaskSort = $targetTask["SORT"];
}
if ($nextTask !== null && $prevTask !== null && ($nextTaskSort - $prevTaskSort) < static::MIN_SORT_DELTA)
{
$connection = Application::getConnection();
$filter = $groupId > 0 ? "GROUP_ID = {$groupId}" : "USER_ID = {$userId}";
$increment = static::SORT_INDEX_INCREMENT;
$connection->queryExecute(
"UPDATE b_tasks_sorting SET SORT = SORT + {$increment} WHERE SORT >= {$nextTaskSort} AND {$filter}"
);
$nextTask = static::getTask($nextTaskId, $userId, $groupId);
$nextTaskSort = $nextTask["SORT"];
}
$sourceTaskSort = 0;
if ($prevTaskId === 0)
{
$sourceTaskSort = $nextTaskSort - static::SORT_INDEX_INCREMENT;
}
else if ($nextTaskId === 0)
{
$sourceTaskSort = $prevTaskSort + static::SORT_INDEX_INCREMENT;
}
else
{
$sourceTaskSort = ($nextTaskSort + $prevTaskSort) / 2;
}
// $sourceTaskSort =
// $nextTaskSort > $prevTaskSort
// ? ($nextTaskSort + $prevTaskSort) / 2
// : $prevTaskSort + static::SORT_INDEX_INCREMENT
// ;
$sourceTask = static::getTask($sourceId, $userId, $groupId);
if ($sourceTask)
{
$result = static::update($sourceTask["ID"], array(
"PREV_TASK_ID" => $prevTaskId,
"NEXT_TASK_ID" => $nextTaskId,
"SORT" => $sourceTaskSort
));
static::fixSiblings($sourceTask);
}
else
{
$fields = array(
"TASK_ID" => $sourceId,
"PREV_TASK_ID" => $prevTaskId,
"NEXT_TASK_ID" => $nextTaskId,
"SORT" => $sourceTaskSort
);
if ($groupId)
{
$fields["GROUP_ID"] = $groupId;
}
else
{
$fields["USER_ID"] = $userId;
}
$result = static::add($fields);
}
if ($prevTask)
{
static::update($prevTask["ID"], array("NEXT_TASK_ID" => $sourceId));
}
if ($nextTask)
{
static::update($nextTask["ID"], array("PREV_TASK_ID" => $sourceId));
}
return true;
}