• Модуль: disk
  • Путь к файлу: ~/bitrix/modules/disk/lib/bitrix24disk/subscribermanager.php
  • Класс: BitrixDiskBitrix24DiskSubscriberManager
  • Вызов: SubscriberManager::collectSubscribers
public function collectSubscribers(BaseObject $object)
{
	if (isset($this->subscribersByObjectId[$object->getId()]))
	{
		return $this->subscribersByObjectId[$object->getId()];
	}

	if (isset($this->detectCycles[$object->getId()]))
	{
		//it's cycle! recursion!
		return array();
	}

	$this->detectCycles[$object->getId()] = true;

	$byParentId = array();
	$subscribers = array();
	if (isset($this->subscribersByObjectId[$object->getParentId()]))
	{
		$subscribers = $this->subscribersByObjectId[$object->getParentId()];
	}
	else
	{
		foreach ($object->getParents(Driver::getInstance()->getFakeSecurityContext()) as $parent)
		{
			if(!$parent instanceof Folder)
			{
				continue;
			}

			$sharingByParent = $this->collectSubscribersBySharings($parent);
			foreach ($sharingByParent as $storageId => $userId)
			{
				$subscribers[$storageId] = $userId;
			}

			//set subscribers to descendants folders
			foreach ($byParentId as $parentId => $data)
			{
				foreach ($sharingByParent as $storageId => $userId)
				{
					$byParentId[$parentId][$storageId] = $userId;
				}
			}

			$byParentId[$parent->getId()] = $sharingByParent;
		}
	}

	$subscribers = $this->appendSubscribersBySharings($object, $subscribers);

	$storage = Storage::loadById($object->getStorageId());
	if ($storage && $storage->getProxyType() instanceof ProxyTypeUser)
	{
		$subscribers[$storage->getId()] = $storage->getEntityId();

		foreach ($byParentId as $parentId => $data)
		{
			$byParentId[$parentId][$storage->getId()] = $storage->getEntityId();
		}
	}

	foreach ($byParentId as $parentId => $data)
	{
		$this->subscribersByObjectId[$parentId] = $data;
	}

	$this->subscribersByObjectId[$object->getId()] = $subscribers;

	return $subscribers;
}