• Модуль: disk
  • Путь к файлу: ~/bitrix/modules/disk/lib/baseobject.php
  • Класс: BitrixDiskBaseObject
  • Вызов: BaseObject::getNextGeneratedName
static function getNextGeneratedName($mainPartName, $suffix, $underObjectId, $withoutLike = false)
{
	$underObjectId = (int)$underObjectId;

	$left = $mainPartName . ' (';
	$right = ')';

	if ($suffix)
	{
		$right = ').'. $suffix;
	}
	$lengthR = mb_strlen($right);
	$lengthL = mb_strlen($left);

	$connection = Application::getConnection();
	$sqlHelper = $connection->getSqlHelper();

	$filterByLike = "NAME LIKE '" . $sqlHelper->forSql($left) . "%' AND";
	if ($withoutLike)
	{
		$filterByLike = '';
	}

	$sql = "
		SELECT NAME FROM b_disk_object 
		WHERE 
			PARENT_ID = {$underObjectId} AND 
			{$filterByLike}
			LEFT(NAME, {$lengthL}) = '" . $sqlHelper->forSql($left) . "' AND
			MID(NAME, {$lengthL} + 1, CHAR_LENGTH(NAME) - {$lengthL} - {$lengthR}) regexp '^[1-9][[:digit:]]*$' AND
			RIGHT(NAME, {$lengthR}) = '" . $sqlHelper->forSql($right) . "'
		ORDER BY CHAR_LENGTH(NAME) DESC, NAME DESC
		LIMIT 1;
	";

	$row = $connection->query($sql)->fetch();
	if (!$row)
	{
		$newName = $mainPartName . " (1)";
		if ($suffix)
		{
			$newName .= "." . $suffix;
		}

		return [
			$newName,
			null,
			1
		];
	}

	$counter = mb_substr($row['NAME'], $lengthL, mb_strlen($row['NAME']) - $lengthL - $lengthR);
	$counter = (int)$counter + 1;

	return [
		$left . $counter . $right,
		$row['NAME'],
		$counter
	];
}