• Модуль: 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);
}