• Модуль: tasks
  • Путь к файлу: ~/bitrix/modules/tasks/lib/internals/database/structure/closuretree.php
  • Класс: BitrixTasksInternalsDataBaseStructureClosureTree
  • Вызов: ClosureTree::delete
static function delete($id, array $settings = array())
{
	$result = new UtilResult();

	if(!static::isNodeExist($id))
	{
		$result->addError('NODE_NOT_FOUND', Loc::getMessage('TASKS_CLOSURE_TREE_NODE_NOT_FOUND'));
	}
	else
	{
		$pCName = static::getParentNodeColumnName();
		$cName = static::getNodeColumnName();
		$tableName = static::getTableName();

		$connection = MainHttpApplication::getConnection();

		if ($settings['DELETE_SUBTREE'] ?? null)
		{
			$sql = "
				delete from ".$tableName." where ".$cName." in (
					".Helper::getTemporaryTableSubQuerySql("select ".$cName." from ".$tableName." where ".$pCName." = '".intval($id)."'", $cName)."
				)
			";
		}
		else
		{
			// we need to detach node with its subtree, then detach each sub-tree, then remove node itself
			$sql = "
				delete
				from
					".$tableName."
				where
					/*nodes from path (above node) + node itself */
					".$pCName." in (
						".Helper::getTemporaryTableSubQuerySql("
							select ".$pCName." from ".$tableName." where ".$cName." = '".intval($id)."' and ".$pCName." != ".$cName."
						", $pCName)."
						union
						select '".intval($id)."'
					)
					and
					/*nodes from subtree (below node + node itself)*/
					".$cName." in (
						".Helper::getTemporaryTableSubQuerySql("
							select ".$cName." from ".$tableName." where ".$pCName." = '".intval($id)."'
						", $cName)."
					)
			";
		}

		try
		{
			$connection->query($sql);
		}
		catch(DBSqlException $e)
		{
			$result->addException($e, 'Error removing subtree');
		}

		if($result->isSuccess())
		{
			$removed = $connection->getAffectedRowsCount();
			if(!$removed)
			{
				$result->addWarning('NO_ROWS_AFFECTED', 'No rows were affected');
			}
		}
	}

	return $result;
}