• Модуль: disk
  • Путь к файлу: ~/bitrix/modules/disk/lib/sharing.php
  • Класс: BitrixDiskSharing
  • Вызов: Sharing::connectToUserStorage
static function connectToUserStorage($userId, array $data, ErrorCollection $errorCollection)
{
	$storage = Driver::getInstance()->getStorageByUserId($userId);
	if(!$storage)
	{
		$storage = Driver::getInstance()->addUserStorage($userId);
	}
	if(!$storage)
	{
		$errorCollection->addOne(
			new Error(
				Loc::getMessage('DISK_SHARING_MODEL_ERROR_COULD_NOT_FIND_USER_STORAGE',
					array('#USER_ID#' => $userId)
				),
				self::ERROR_COULD_NOT_FIND_USER_STORAGE)
		);
		return null;
	}

	$selfConnect = !empty($data['SELF_CONNECT']);
	$linkName = !empty($data['LINK_NAME'])? $data['LINK_NAME'] : null;
	unset($data['SELF_CONNECT'], $data['LINK_NAME']);

	$data['TYPE'] = SharingTable::TYPE_TO_USER;
	$data['FROM_ENTITY'] = self::CODE_USER . (int)$userId;
	$data['TO_ENTITY'] = self::CODE_USER . (int)$userId;
	$data['TASK_NAME'] = RightsManager::TASK_READ;

	if(isset($data['REAL_OBJECT']) && $data['REAL_OBJECT'] instanceof BaseObject)
	{
		/** @noinspection PhpUndefinedMethodInspection */
		$data['REAL_OBJECT_ID'] = $data['REAL_OBJECT']->getId();
	}
	elseif(isset($data['REAL_OBJECT_ID']))
	{
		$data['REAL_OBJECT'] = BaseObject::loadById($data['REAL_OBJECT_ID']);
	}
	else
	{
		$errorCollection->addOne(
			new Error(Loc::getMessage('DISK_SHARING_MODEL_ERROR_EMPTY_REAL_OBJECT'), self::ERROR_EMPTY_REAL_OBJECT)
		);
		return null;
	}
	/** @var BitrixDiskBaseObject $objectToSharing */
	$objectToSharing = $data['REAL_OBJECT'];
	//resolve to last real object. In table we write only real (not link) id.
	$objectToSharing = $objectToSharing->getRealObject();
	if (!$objectToSharing)
	{
		return null;
	}
	$data['REAL_OBJECT_ID'] = $objectToSharing->getId();
	$data['REAL_STORAGE_ID'] = $objectToSharing->getStorageId();

	$dataToInsert = $data;
	unset($dataToInsert['REAL_OBJECT']);

	$sharingModel = parent::add($dataToInsert, $errorCollection);
	if(!$sharingModel)
	{
		return null;
	}
	$sharingModel->setAttributes(array('REAL_OBJECT' => $objectToSharing));

	if(!$selfConnect)
	{
		self::processConnectAndNotify(array($sharingModel), $objectToSharing);
	}
	else
	{
		if(!$sharingModel->approve(array('LINK_NAME' => $linkName)))
		{
			$errorCollection->add($sharingModel->getErrors());
			$sharingModel->delete($userId);
			return null;
		}
	}

	return $sharingModel;
}