• Модуль: disk
  • Путь к файлу: ~/bitrix/modules/disk/lib/rightsmanager.php
  • Класс: BitrixDiskSimpleReBuilder
  • Вызов: SimpleReBuilder::fillChildren
private function fillChildren()
{
	if($this->object instanceof File)
	{
		return;
	}

	$specificRightsByObjectId = array(
		$this->object->getId() => $this->specificRights,
	);
	//store all rights on object (all inherited rights)
	$inheritedRightsByObjectId = array(
		$this->object->getId() => $this->getParentRights(),
	);

	$childrenRights = Driver::getInstance()->getRightsManager()->getDescendantsRights($this->object->getId());
	if(!$childrenRights)
	{
		TmpSimpleRight::fillDescendants($this->object->getId(), $this->setupSession->getId());
		return;
	}

	//store all specific rights on object
	foreach ($childrenRights as $right)
	{
		if(!isset($specificRightsByObjectId[$right['OBJECT_ID']]))
		{
			$specificRightsByObjectId[$right['OBJECT_ID']] = array();
		}
		$specificRightsByObjectId[$right['OBJECT_ID']][] = $right;
	}
	unset($right, $childrenRights);

	$simpleRightsByObjectId = array(
		$this->object->getId() => $this->simpleRights,
	);

	$query = ObjectTable::getDescendants($this->object->getId(), array('select' => array('ID', 'PARENT_ID')));
	while($object = $query->fetch())
	{
		//specific rights on object
		if(!isset($specificRightsByObjectId[$object['ID']]))
		{
			$specificRightsByObjectId[$object['ID']] = array();
		}
		if(!isset($inheritedRightsByObjectId[$object['ID']]))
		{
			$inheritedRightsByObjectId[$object['ID']] = array();
		}
		if(!isset($simpleRightsByObjectId[$object['PARENT_ID']]))
		{
			$simpleRightsByObjectId[$object['PARENT_ID']] = array();
		}
		if(isset($inheritedRightsByObjectId[$object['PARENT_ID']]))
		{
			$inheritedRightsByObjectId[$object['ID']] = array_merge(
				$inheritedRightsByObjectId[$object['PARENT_ID']],
				($specificRightsByObjectId[$object['PARENT_ID']]?: array())
			);
		}
		else
		{
			$inheritedRightsByObjectId[$object['PARENT_ID']] = array();
		}

		$simpleRightsByObjectId[$object['ID']] = $this->uniqualizeSimpleRights(
			$this->getNewSimpleRight(
				$specificRightsByObjectId[$object['ID']],
				$inheritedRightsByObjectId[$object['ID']],
				$simpleRightsByObjectId[$object['PARENT_ID']]
		));

		$items = array();
		foreach($simpleRightsByObjectId[$object['ID']] as $right)
		{
			$items[] = array(
				'OBJECT_ID' => $object['ID'],
				'ACCESS_CODE' => $right['ACCESS_CODE'],
			);
		}
		unset($right);

		TmpSimpleRight::insertBatchBySessionId($items, $this->setupSession->getId());
	}
	unset($object);
}