• Модуль: tasks
  • Путь к файлу: ~/bitrix/modules/tasks/lib/checklist/internals/checklisttree.php
  • Класс: BitrixTasksCheckListInternalsCheckListTree
  • Вызов: CheckListTree::detachSubTree
static function detachSubTree($rootId)
{
	$result = new Result();

	if (!static::isNodeExist($rootId))
	{
		$result = static::addErrorToResult($result, ['#ID#' => $rootId], __METHOD__, 'NODE_NOT_FOUND');
	}
	else
	{
		$children = static::getChildren($rootId);

		if (empty($children))
		{
			$result = static::detach($rootId);
		}
		else
		{
			$children[] = $rootId;
			$children = implode(', ', $children);

			$connection = Application::getConnection();

			$tableName = static::getTableName();
			$parentColumnName = static::getParentNodeColumnName();
			$childColumnName = static::getNodeColumnName();
			$levelColumnName = static::getLevelColumnName();

			/** @noinspection PhpUndefinedClassInspection */
			$parentSubQuerySql = Helper::getTemporaryTableSubQuerySql(
				"SELECT {$parentColumnName} FROM {$tableName} WHERE {$childColumnName} = {$rootId} AND {$levelColumnName} <> 0",
				$parentColumnName
			);

			$sql = "
				DELETE FROM {$tableName}
				WHERE {$parentColumnName} IN ({$parentSubQuerySql}) AND {$childColumnName} IN ({$children})
			";

			try
			{
				$connection->query($sql);
			}
			catch (SqlException $exception)
			{
				$result->addException($exception);
			}

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

	return $result;
}