- Модуль: sale
- Путь к файлу: ~/bitrix/modules/sale/lib/location/tree.php
- Класс: BitrixSaleLocationTree
- Вызов: Tree::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;
}