• Модуль: socialnetwork
  • Путь к файлу: ~/bitrix/modules/socialnetwork/lib/controller/livefeed/blogpost.php
  • Класс: BitrixSocialnetworkControllerLivefeedBlogPost
  • Вызов: BlogPost::shareAction
public function shareAction(array $params = [])
{
	$postId = (int)($params['postId'] ?? 0);
	$destCodesList = ($params['DEST_CODES'] ?? []);
	$destData = ($params['DEST_DATA'] ?? []);
	$invitedUserName = ($params['INVITED_USER_NAME'] ?? []);
	$invitedUserLastName = ($params['INVITED_USER_LAST_NAME'] ?? []);
	$invitedUserCrmEntity = ($params['INVITED_USER_CRM_ENTITY'] ?? []);
	$invitedUserCreateCrmContact = ($params['INVITED_USER_CREATE_CRM_CONTACT'] ?? []);
	$readOnly = (isset($params['readOnly']) && $params['readOnly'] === 'Y');
	$pathToUser = ($params['pathToUser'] ?? '');
	$pathToPost = ($params['pathToPost'] ?? '');
	$currentUserId = $this->getCurrentUser()->getId();

	$data = [
		'ALLOW_EMAIL_INVITATION' => (
			ModuleManager::isModuleInstalled('mail')
			&& ModuleManager::isModuleInstalled('intranet')
			&& (
				!Loader::includeModule('bitrix24')
				|| CBitrix24::isEmailConfirmed()
			)
		)
	];

	if ($postId <= 0)
	{
		$this->addError(new Error(Loc::getMessage('SONET_CONTROLLER_LIVEFEED_BLOGPOST_EMPTY'), 'SONET_CONTROLLER_LIVEFEED_BLOGPOST_EMPTY'));
		return null;
	}

	if (
		!Loader::includeModule('blog')
		|| !($postItem = BitrixBlogItemPost::getById($postId))
	)
	{
		$this->addError(
			new Error(
				Loc::getMessage('SONET_CONTROLLER_LIVEFEED_BLOGPOST_NOT_FOUND'),
				'SONET_CONTROLLER_LIVEFEED_BLOGPOST_NOT_FOUND'
			)
		);

		return null;
	}

	$currentUserPerm = Helper::getBlogPostPerm([
		'USER_ID' => $currentUserId,
		'POST_ID' => $postId,
	]);
	if ($currentUserPerm <= Permissions::DENY)
	{
		$this->addError(
			new Error(
				Loc::getMessage('SONET_CONTROLLER_LIVEFEED_BLOGPOST_NOT_FOUND'),
				'SONET_CONTROLLER_LIVEFEED_BLOGPOST_NOT_FOUND'
			)
		);

		return null;
	}

	$postFields = $postItem->getFields();

	if (
		(int)$postFields['AUTHOR_ID'] !== $currentUserId
		&& ComponentHelper::isCurrentUserExtranet()
	)
	{
		$visibleUserIdList = CExtranet::getMyGroupsUsersSimple(SITE_ID);

		if (!empty(array_diff([(int)$postFields['AUTHOR_ID']], $visibleUserIdList)))
		{
			$this->addError(
				new Error(
					Loc::getMessage('SONET_CONTROLLER_LIVEFEED_BLOGPOST_NOT_FOUND'),
					'SONET_CONTROLLER_LIVEFEED_BLOGPOST_NOT_FOUND'
				)
			);

			return null;
		}
	}

	$perms2update = [];
	$sonetPermsListOld = CBlogPost::getSocNetPerms($postId);
	foreach($sonetPermsListOld as $type => $val)
	{
		foreach($val as $id => $values)
		{
			if($type !== 'U')
			{
				$perms2update[] = $type . $id;
			}
			else
			{
				$perms2update[] = (
					in_array('US' . $id, $values, true)
						? 'UA'
						: $type.$id
				);
			}
		}
	}

	$newRightsList = [];

	$sonetPermsListNew = [
		'UA' => [],
		'U' => [],
		'UE' => [],
		'SG' => [],
		'DR' => []
	];

	if (!empty($destData))
	{
		try
		{
			$entitites = Json::decode($destData);
			if (!empty($entitites))
			{
				$destCodesList = BitrixMainUIEntitySelectorConverter::convertToFinderCodes($entitites);
			}
		}
		catch(ArgumentException $e)
		{
		}
	}

	foreach($destCodesList as $destCode)
	{
		if ($destCode === 'UA')
		{
			$sonetPermsListNew['UA'][] = 'UA';
		}
		elseif (preg_match('/^UE(.+)$/i', $destCode, $matches))
		{
			$sonetPermsListNew['UE'][] = $matches[1];
		}
		elseif (preg_match('/^U(d+)$/i', $destCode, $matches))
		{
			$sonetPermsListNew['U'][] = 'U'.$matches[1];
		}
		elseif (preg_match('/^SG(d+)$/i', $destCode, $matches))
		{
			$sonetPermsListNew['SG'][] = 'SG'.$matches[1];
		}
		elseif (preg_match('/^DR(d+)$/i', $destCode, $matches))
		{
			$sonetPermsListNew['DR'][] = 'DR'.$matches[1];
		}
	}

	$HTTPPost = [
		'SONET_PERMS' => $sonetPermsListNew,
		'INVITED_USER_NAME' => $invitedUserName,
		'INVITED_USER_LAST_NAME' => $invitedUserLastName,
		'INVITED_USER_CRM_ENTITY' => $invitedUserCrmEntity,
		'INVITED_USER_CREATE_CRM_CONTACT' => $invitedUserCreateCrmContact
	];
	ComponentHelper::processBlogPostNewMailUser($HTTPPost, $data);
	$sonetPermsListNew = $HTTPPost['SONET_PERMS'];

	$currentAdmin = CSocNetUser::isCurrentUserModuleAdmin();
	$canPublish = true;

	foreach($sonetPermsListNew as $type => $val)
	{
		foreach($val as $code)
		{
			if(in_array($type, [ 'U', 'SG', 'DR', 'CRMCONTACT' ]))
			{
				if (!in_array($code, $perms2update))
				{
					if ($type === 'SG')
					{
						$sonetGroupId = (int)str_replace('SG', '', $code);

						$canPublish = (
							$currentAdmin
							|| CSocNetFeaturesPerms::canPerformOperation($currentUserId, SONET_ENTITY_GROUP, $sonetGroupId, 'blog', 'write_post')
							|| CSocNetFeaturesPerms::canPerformOperation($currentUserId, SONET_ENTITY_GROUP, $sonetGroupId, 'blog', 'moderate_post')
							|| CSocNetFeaturesPerms::canPerformOperation($currentUserId, SONET_ENTITY_GROUP, $sonetGroupId, 'blog', 'full_post')
						);

						if (!$canPublish)
						{
							break;
						}
					}

					$perms2update[] = $code;
					$newRightsList[] = $code;
				}
			}
			elseif ($type === 'UA')
			{
				if (!in_array('UA', $perms2update, true))
				{
					$perms2update[] = 'UA';
					$newRightsList[] = 'UA';
				}
			}
		}

		if (!$canPublish)
		{
			break;
		}
	}

	if (
		!empty($newRightsList)
		&& $canPublish
	)
	{
		ComponentHelper::processBlogPostShare(
			[
				'POST_ID' => $postId,
				'BLOG_ID' => $postFields['BLOG_ID'],
				'SITE_ID' => SITE_ID,
				'SONET_RIGHTS' => $perms2update,
				'NEW_RIGHTS' => $newRightsList,
				'USER_ID' => $currentUserId
			],
			[
				'MENTION' => 'N',
				'LIVE' => 'Y',
				'CAN_USER_COMMENT' => (!$readOnly ? 'Y' : 'N'),
				'PATH_TO_USER' => $pathToUser,
				'PATH_TO_POST' => $pathToPost,
			]
		);
	}
	elseif (!$canPublish)
	{
		$this->addError(new Error(Loc::getMessage('SONET_CONTROLLER_LIVEFEED_BLOGPOST_SHARE_PREMODERATION'), 'SONET_CONTROLLER_LIVEFEED_BLOGPOST_SHARE_PREMODERATION'));
		return null;
	}
}