- Модуль: sale
- Путь к файлу: ~/bitrix/modules/sale/lib/location/tree.php
- Класс: BitrixSaleLocationTree
- Вызов: Tree::getPathToMultipleNodes
static function getPathToMultipleNodes($nodeInfo = array(), $parameters = array(), $behaviour = array('SHOW_LEAF' => true))
{
Assert::expectNotEmptyArray($nodeInfo, '$nodeInfo');
if(!is_array($behaviour))
$behaviour = array();
if(!isset($behaviour['SHOW_LEAF']))
$behaviour['SHOW_LEAF'] = true;
if(empty($parameters))
$parameters = array();
if(is_array($parameters['select']))
$originSelect = $parameters['select'];
else
$originSelect = array();
$parameters['order'] = array(
'LEFT_MARGIN' => 'asc'
);
$parameters['select'][] = 'ID';
$parameters['select'][] = 'PARENT_ID';
$filter = array();
foreach($nodeInfo as $node)
{
Assert::expectNotEmptyArray($node, '$nodeInfo[]');
$node['ID'] = Assert::expectIntegerPositive($node['ID'], '$nodeInfo[][ID]');
$node['LEFT_MARGIN'] = Assert::expectIntegerNonNegative($node['LEFT_MARGIN'], '$nodeInfo[][LEFT_MARGIN]');
$node['RIGHT_MARGIN'] = Assert::expectIntegerPositive($node['RIGHT_MARGIN'], '$nodeInfo[][RIGHT_MARGIN]');
$filter[] = array(
'<=LEFT_MARGIN' => intval($node['LEFT_MARGIN']),
'>=RIGHT_MARGIN' => intval($node['RIGHT_MARGIN'])
);
if(!$behaviour['SHOW_LEAF'])
$filter['!=ID'] = $node['ID'];
}
$filter['LOGIC'] = 'OR';
$parameters['filter'][] = $filter;
$res = self::getList($parameters);
$index = array();
while($item = $res->Fetch())
{
$index[$item['ID']] = array(
'NODE' => $item,
'PARENT_ID' => $item['PARENT_ID']
);
}
$depthLimit = count($index);
$pathes = array();
foreach($nodeInfo as $node)
{
$path = array();
$id = $node['ID'];
$i = 0;
while($id)
{
if($i >= $depthLimit) // there is a cycle or smth like, anyway this is abnormal situation
break;
if(!isset($index[$id])) // non-existing element in the chain. strange, abort
break;
$resultNode = $index[$id]['NODE'];
if(!in_array('PARENT_ID', $originSelect))
unset($resultNode['PARENT_ID']);
if(!in_array('ID', $originSelect))
unset($resultNode['ID']);
$path[$id] = $resultNode;
$id = intval($index[$id]['PARENT_ID']);
$i++;
}
$pathes[$node['ID']] = array(
'ID' => $node['ID'],
'PATH' => $path
);
}
return new DBArrayResult($pathes);
}