• Модуль: sale
  • Путь к файлу: ~/bitrix/modules/sale/lib/location/tree.php
  • Класс: BitrixSaleLocationis
  • Вызов: is::makeSortSpace
static function makeSortSpace($primary, $direction, $primaryParent, $knownSort = false)
{
	$primary = Assert::expectIntegerPositive($primary, '$primary');
	$primaryParent = Assert::expectIntegerPositive($primary, '$primaryParent');

	$nodeFound = false;
	$sorts = array();

	$nextNodeId = false;
	$prevNodeId = false;

	$prev = false;
	$res = self::getChildren($primaryParent, array('select' => array('ID', 'SORT', 'CODE'), 'order' => array('SORT' => 'asc')));
	while($item = $res->Fetch())
	{
		if($nodeFound && !$nextNodeId)
			$nextNodeId = $item['ID'];

		if($item['ID'] == $primary)
		{
			$nodeFound = true;
			$prevNodeId = $prev;
		}

		$sorts[$item['ID']] = $item['SORT'];

		$prev = $item['ID'];
	}

	// no node exists or they are not neighbours
	if(!$nodeFound)
		return false;

	// add extra items
	if(!$prevNodeId)
	{
		$sorts = array('FH' => 0) + $sorts;
		$prevNodeId = 'FH';
	}
	if(!$nextNodeId)
	{
		$sorts['FT'] = PHP_INT_MAX;
		$nextNodeId = 'FT';
	}

	// handle some obvious situations
	if($direction == self::SORT_FREE_BEFORE)
	{
		if($knownSort && ($knownSort < $sorts[$prevNodeId]) && ($knownSort < $sorts[$primary]))
			return $knownSort; // its okay, current sort fits

		// inequation above is not true, but there is free space between nodes
		if($sorts[$primary] - $sorts[$prevNodeId] > 1)
			return $sorts[$prevNodeId] + 1;

		$startShift = $primary;
		$return = $sorts[$prevNodeId] + self::SORT_HOLE_SIZE_HALF;
	}
	else
	{
		if($knownSort && ($knownSort < $sorts[$primary]) && ($knownSort < $sorts[$nextNodeId]))
			return $knownSort; // its okay, current sort fits

		// inequation above is not true, but there is free space between nodes
		if($sorts[$nextNodeId] - $sorts[$primary] > 1)
			return $sorts[$primary] + 1;

		$startShift = $nextNodeId;
		$return = $sorts[$primary] + self::SORT_HOLE_SIZE_HALF;
	}

	// .. or else we forced to make a hole
	$begin = false;
	$shift = $sorts[$startShift] + self::SORT_HOLE_SIZE;

	foreach($sorts as $id => $sVal)
	{
		if($id == $startShift)
			$begin = true;

		if($begin && $sVal <= $shift)
		{
			$shift = $sVal + self::SORT_HOLE_SIZE;
			parent::update($id, array('SORT' => $shift));
		}
	}

	return $return;
}