- Модуль: tasks
- Путь к файлу: ~/bitrix/modules/tasks/lib/internals/database/tree.php
- Класс: BitrixTasksInternalsDataBaseto
- Вызов: to::moveLink
static function moveLink($id, $parentId, $behaviour = array('CREATE_PARENT_NODE_ON_NOTFOUND' => true))
{
$id = Assert::expectIntegerPositive($id, '$id');
$parentId = Assert::expectIntegerNonNegative($parentId, '$parentId'); // 0 allowed - means "detach into a separate branch"
if(!is_array($behaviour))
$behaviour = array();
if(!isset($behaviour['CREATE_PARENT_NODE_ON_NOTFOUND']))
$behaviour['CREATE_PARENT_NODE_ON_NOTFOUND'] = true;
$parentColName = static::getPARENTIDColumnName();
$idColName = static::getIDColumnName();
if(!static::checkNodeExists($id))
{
throw new TreeTargetNodeNotFoundException(false, array('NODES' => array($id, $parentId)));
}
$dbConnection = MainHttpApplication::getConnection();
if($parentId > 0)
{
if(!static::checkNodeExists($parentId))
{
if($behaviour['CREATE_PARENT_NODE_ON_NOTFOUND'])
{
if(!static::add(array($parentColName => $parentId, $idColName => $parentId))->isSuccess())
{
throw new TreeException('Can not create node', array('NODES' => array($parentId)));
}
}
else
{
throw new TreeParentNodeNotFoundException(false, array('NODES' => array($parentId)));
}
}
if(static::checkLinkExists($id, $parentId))
{
throw new TreeLinkExistsException(false, array('NODES' => array($id, $parentId)));
}
$check = $dbConnection->query("select ".$idColName." from ".static::getTableName()." where ".$parentColName." = '".intval($id)."' and ".$idColName." = '".intval($parentId)."'")->fetch();
if(is_array($check))
{
throw new MainArgumentException('Can not move tree inside itself');
}
}
// TODO: rewrite this using deleteLink() and createLink()
// detach subtree
$dbConnection->query("delete
from ".static::getTableName()."
where
".$idColName." in (
".Helper::getTemporaryTableSubQuerySql(static::getSubTreeSql($id), $idColName)."
)
and
".$parentColName." in (
".Helper::getTemporaryTableSubQuerySql(static::getPathToNodeSql($id), $parentColName)."
)
and
".$idColName." != ".$parentColName./*exclude links to selves*/"
and
".$parentColName." != '".intval($id)./*exclude link to root node of a tree being detached*/"'
");
if($parentId > 0)
{
// reattach subtree to other path
$res = static::getPathToNode($parentId, array('select' => array('ID' => $parentColName)));
while($item = $res->fetch())
{
$dbConnection->query(
"insert into ".static::getTableName()."
(".$parentColName.", ".$idColName.", ".static::getDIRECTColumnName().")
select
'".$item['ID']."',
T.".$idColName.",
".(
$item['ID'] == $parentId
?
"
CASE
WHEN
T.".$idColName." = '".$id."'
THEN
'1'
ELSE
'0'
END
"
:
"'0'"
)."
from
".static::getTableName()." T
where
".$parentColName." = '".intval($id)."'"
);
}
}
return array('RESULT' => true);
}