• Модуль: socialnetwork
  • Путь к файлу: ~/bitrix/modules/socialnetwork/lib/componenthelper.php
  • Класс: BitrixSocialnetworkComponentHelper
  • Вызов: ComponentHelper::processBlogPostShare
static function processBlogPostShare($fields, $params)
{
	$postId = (int)$fields["POST_ID"];
	$blogId = (int)$fields["BLOG_ID"];
	$siteId = $fields["SITE_ID"];
	$sonetRights = $fields["SONET_RIGHTS"];
	$newRights = $fields["NEW_RIGHTS"];
	$userId = (int)$fields["USER_ID"];

	$clearCommentsCache = (!isset($params['CLEAR_COMMENTS_CACHE']) || $params['CLEAR_COMMENTS_CACHE'] !== 'N');

	$commentId = false;
	$logId = false;

	if (
		Loader::includeModule('blog')
		&& CBlogPost::update($postId, array("SOCNET_RIGHTS" => $sonetRights, "HAS_SOCNET_ALL" => "N"))
	)
	{
		BXClearCache(true, self::getBlogPostCacheDir(array(
			'TYPE' => 'post',
			'POST_ID' => $postId
		)));
		BXClearCache(true, self::getBlogPostCacheDir(array(
			'TYPE' => 'post_general',
			'POST_ID' => $postId
		)));
		BXClearCache(True, self::getBlogPostCacheDir(array(
			'TYPE' => 'posts_popular',
			'SITE_ID' => $siteId
		)));

		$logSiteListNew = array();
		$user2NotifyList = array();
		$sonetPermissionList = CBlogPost::getSocnetPermsName($postId);
		$extranet = Loader::includeModule("extranet");
		$extranetSite = ($extranet ? CExtranet::getExtranetSiteID() : false);
		$tzOffset = CTimeZone::getOffset();

		$res = CBlogPost::getList(
			array(),
			array("ID" => $postId),
			false,
			false,
			array("ID", "BLOG_ID", "PUBLISH_STATUS", "TITLE", "AUTHOR_ID", "ENABLE_COMMENTS", "NUM_COMMENTS", "VIEWS", "CODE", "MICRO", "DETAIL_TEXT", "DATE_PUBLISH", "CATEGORY_ID", "HAS_SOCNET_ALL", "HAS_TAGS", "HAS_IMAGES", "HAS_PROPS", "HAS_COMMENT_IMAGES")
		);
		$post = $res->fetch();
		if (!$post)
		{
			return false;
		}

		if (!empty($post['DETAIL_TEXT']))
		{
			$post['DETAIL_TEXT'] = BitrixMainTextEmoji::decode($post['DETAIL_TEXT']);
		}

		$intranetUserIdList = ($extranet ? CExtranet::getIntranetUsers() : false);
		$auxLiveParamList = array();
		$sharedToIntranetUser = false;

		foreach ($sonetPermissionList as $type => $v)
		{
			foreach ($v as $vv)
			{
				if (
					$type === "SG"
					&& in_array($type . $vv["ENTITY_ID"], $newRights, true)
				)
				{
					$renderParts = new LivefeedRenderPartsSonetGroup();
					$renderData = $renderParts->getData($vv["ENTITY_ID"]);

					if($sonetGroup = CSocNetGroup::getByID($vv["ENTITY_ID"]))
					{
						$res = CSocNetGroup::getSite($vv["ENTITY_ID"]);
						while ($groupSiteList = $res->fetch())
						{
							$logSiteListNew[] = $groupSiteList["LID"];
						}

						$auxLiveParamList[] = array(
							"ENTITY_TYPE" => 'SG',
							"ENTITY_ID" => $renderData['id'],
							"NAME" => $renderData['name'],
							"LINK" => $renderData['link'],
							"VISIBILITY" => ($sonetGroup["VISIBLE"] === "Y" ? "all" : "group_members")
						);
					}
				}
				elseif ($type === "U")
				{
					if (
						in_array("US" . $vv["ENTITY_ID"], $vv["ENTITY"], true)
						&& in_array("UA", $newRights, true)
					)
					{
						$renderParts = new LivefeedRenderPartsUser();
						$renderData = $renderParts->getData(0);

						$auxLiveParamList[] = array(
							"ENTITY_TYPE" => 'UA',
							"ENTITY_ID" => 'UA',
							"NAME" => $renderData['name'],
							"LINK" => $renderData['link'],
							"VISIBILITY" => 'all'
						);
					}
					elseif (in_array($type . $vv["ENTITY_ID"], $newRights, true))
					{
						$renderParts = new LivefeedRenderPartsUser();
						$renderData = $renderParts->getData($vv["ENTITY_ID"]);

						$user2NotifyList[] = $vv["ENTITY_ID"];

						if (
							$extranet
							&& is_array($intranetUserIdList)
							&& !in_array($vv["ENTITY_ID"], $intranetUserIdList)
						)
						{
							$logSiteListNew[] = $extranetSite;
							$visibility = 'extranet';
						}
						else
						{
							$sharedToIntranetUser = true;
							$visibility = 'intranet';
						}

						$auxLiveParamList[] = array(
							"ENTITY_TYPE" => 'U',
							"ENTITY_ID" => $renderData['id'],
							"NAME" => $renderData['name'],
							"LINK" => $renderData['link'],
							"VISIBILITY" => $visibility
						);
					}
				}
				elseif (
					$type === "DR"
					&& in_array($type.$vv["ENTITY_ID"], $newRights)
				)
				{
					$renderParts = new LivefeedRenderPartsDepartment();
					$renderData = $renderParts->getData($vv["ENTITY_ID"]);

					$auxLiveParamList[] = array(
						"ENTITY_TYPE" => 'DR',
						"ENTITY_ID" => $renderData['id'],
						"NAME" => $renderData['name'],
						"LINK" => $renderData['link'],
						"VISIBILITY" => 'intranet'
					);
				}
			}
		}

		$userIP = CBlogUser::getUserIP();
		$auxText = CommentAuxShare::getPostText();
		$mention = (
			isset($params["MENTION"])
			&& $params["MENTION"] === "Y"
		);

		$commentFields = Array(
			"POST_ID" => $postId,
			"BLOG_ID" => $blogId,
			"POST_TEXT" => $auxText,
			"DATE_CREATE" => convertTimeStamp(time() + $tzOffset, "FULL"),
			"AUTHOR_IP" => $userIP[0],
			"AUTHOR_IP1" => $userIP[1],
			"PARENT_ID" => false,
			"AUTHOR_ID" => $userId,
			"SHARE_DEST" => implode(",", $newRights).($mention ? '|mention' : ''),
		);

		$userIdSent = [];

		if($commentId = CBlogComment::add($commentFields, false))
		{
			if ($clearCommentsCache)
			{
				BXClearCache(true, self::getBlogPostCacheDir(array(
					'TYPE' => 'post_comments',
					'POST_ID' => $postId
				)));
			}

			if ((int)$post["AUTHOR_ID"] !== $userId)
			{
				$fieldsIM = array(
					"TYPE" => "SHARE",
					"TITLE" => htmlspecialcharsback($post["TITLE"]),
					"URL" => CComponentEngine::makePathFromTemplate(
						htmlspecialcharsBack($params["PATH_TO_POST"]),
						array(
							"post_id" => $postId,
							"user_id" => $post["AUTHOR_ID"]
						)
					),
					"ID" => $postId,
					"FROM_USER_ID" => $userId,
					"TO_USER_ID" => array($post["AUTHOR_ID"]),
				);
				CBlogPost::notifyIm($fieldsIM);
				$userIdSent[] = array_merge($userIdSent, $fieldsIM["TO_USER_ID"]);
			}

			if(!empty($user2NotifyList))
			{
				$fieldsIM = array(
					"TYPE" => "SHARE2USERS",
					"TITLE" => htmlspecialcharsback($post["TITLE"]),
					"URL" => CComponentEngine::makePathFromTemplate(
						htmlspecialcharsBack($params["PATH_TO_POST"]),
						array(
							"post_id" => $postId,
							"user_id" => $post["AUTHOR_ID"]
						)),
					"ID" => $postId,
					"FROM_USER_ID" => $userId,
					"TO_USER_ID" => $user2NotifyList,
				);
				CBlogPost::notifyIm($fieldsIM);
				$userIdSent[] = array_merge($userIdSent, $fieldsIM["TO_USER_ID"]);

				CBlogPost::notifyMail(array(
					"type" => "POST_SHARE",
					"siteId" => $siteId,
					"userId" => $user2NotifyList,
					"authorId" => $userId,
					"postId" => $post["ID"],
					"postUrl" => CComponentEngine::makePathFromTemplate(
						'/pub/post.php?post_id=#post_id#',
						array(
							"post_id"=> $post["ID"]
						)
					)
				));
			}
		}

		$blogPostLivefeedProvider = new BitrixSocialnetworkLivefeedBlogPost;

		/* update socnet log rights*/
		$res = CSocNetLog::getList(
			array("ID" => "DESC"),
			array(
				"EVENT_ID" => $blogPostLivefeedProvider->getEventId(),
				"SOURCE_ID" => $postId
			),
			false,
			false,
			array("ID", "ENTITY_TYPE", "ENTITY_ID", "USER_ID", "EVENT_ID")
		);
		if ($logEntry = $res->fetch())
		{
			$logId = $logEntry["ID"];
			$logSiteList = array();
			$res = CSocNetLog::getSite($logId);
			while ($logSite = $res->fetch())
			{
				$logSiteList[] = $logSite["LID"];
			}
			$logSiteListNew = array_unique(array_merge($logSiteListNew, $logSiteList));

			if (
				$extranet
				&& $sharedToIntranetUser
				&& count($logSiteListNew) == 1
				&& $logSiteListNew[0] == $extranetSite
			)
			{
				$logSiteListNew[] = CSite::getDefSite();
			}

			$socnetPerms = self::getBlogPostSocNetPerms(array(
				'postId' => $postId,
				'authorId' => $post["AUTHOR_ID"]
			));

			CSocNetLogRights::deleteByLogID($logId);
			CSocNetLogRights::add($logId, $socnetPerms, true, false);

			foreach($newRights as $GROUP_CODE)
			{
				if (preg_match('/^U(d+)$/', $GROUP_CODE, $matches))
				{
					ComponentHelper::userLogSubscribe(array(
						'logId' => $logId,
						'userId' => $matches[1],
						'siteId' => $siteId,
						'typeList' => array(
							'FOLLOW',
							'COUNTER_COMMENT_PUSH'
						),
						'followDate' => 'CURRENT'
					));
				}
			}

			if (count(array_diff($logSiteListNew, $logSiteList)) > 0)
			{
				CSocNetLog::update($logId, array(
					"ENTITY_TYPE" => $logEntry["ENTITY_TYPE"], // to use any real field
					"SITE_ID" => $logSiteListNew
				));
			}

			if ($commentId > 0)
			{
				$connection = BitrixMainApplication::getConnection();
				$helper = $connection->getSqlHelper();

				$logCommentFields = array(
					'ENTITY_TYPE' => SONET_ENTITY_USER,
					'ENTITY_ID' => $post["AUTHOR_ID"],
					'EVENT_ID' => 'blog_comment',
					'=LOG_DATE' => $helper->getCurrentDateTimeFunction(),
					'LOG_ID' => $logId,
					'USER_ID' => $userId,
					'MESSAGE' => $auxText,
					"TEXT_MESSAGE" => $auxText,
					'MODULE_ID' => false,
					'SOURCE_ID' => $commentId,
					'RATING_TYPE_ID' => 'BLOG_COMMENT',
					'RATING_ENTITY_ID' => $commentId
				);

				CSocNetLogComments::add($logCommentFields, false, false);
			}

			CSocNetLogFollow::deleteByLogID($logId, "Y", true);

			/* subscribe share author */
			self::userLogSubscribe([
				'logId' => $logId,
				'userId' => $userId,
				'typeList' => [
					'FOLLOW',
					'COUNTER_COMMENT_PUSH',
				],
				'followDate' => 'CURRENT',
			]);
		}

		/* update socnet groupd activity*/
		foreach($newRights as $v)
		{
			if(mb_substr($v, 0, 2) === "SG")
			{
				$groupId = (int)mb_substr($v, 2);
				if($groupId > 0)
				{
					CSocNetGroup::setLastActivity($groupId);
				}
			}
		}

		BitrixBlogBroadcast::send(array(
			"EMAIL_FROM" => COption::getOptionString("main","email_from", "nobody@nobody.com"),
			"SOCNET_RIGHTS" => $newRights,
			"ENTITY_TYPE" => "POST",
			"ENTITY_ID" => $post["ID"],
			"AUTHOR_ID" => $post["AUTHOR_ID"],
			"URL" => CComponentEngine::makePathFromTemplate(
				htmlspecialcharsBack($params["PATH_TO_POST"]),
				array(
					"post_id" => $post["ID"],
					"user_id" => $post["AUTHOR_ID"]
				)
			),
			"EXCLUDE_USERS" => $userIdSent
		));

		if (!$mention)
		{
			BitrixMainFinderDestTable::merge(array(
				"CONTEXT" => "blog_post",
				"CODE" => BitrixMainFinderDestTable::convertRights($newRights)
			));
		}

		if (BitrixMainLoader::includeModule('crm'))
		{
			CCrmLiveFeedComponent::processCrmBlogPostRights($logId, $logEntry, $post, 'share');
		}

		if (
			(int)$commentId > 0
			&& (
				!isset($params["LIVE"])
				|| $params["LIVE"] !== "N"
			)
		)
		{
			$provider = BitrixSocialnetworkCommentAuxBase::init(BitrixSocialnetworkCommentAuxShare::getType(), array(
				'liveParamList' => $auxLiveParamList
			));

			CBlogComment::addLiveComment($commentId, array(
				"PATH_TO_USER" => $params["PATH_TO_USER"],
				"PATH_TO_POST" => CComponentEngine::makePathFromTemplate(
					htmlspecialcharsBack($params["PATH_TO_POST"]),
					array(
						"post_id" => $post["ID"],
						"user_id" => $post["AUTHOR_ID"]
					)
				),
				"LOG_ID" => ($logId ? (int)$logId : 0),
				"AUX" => 'share',
				"AUX_LIVE_PARAMS" => $provider->getLiveParams(),
				"CAN_USER_COMMENT" => (!empty($params["CAN_USER_COMMENT"]) && $params["CAN_USER_COMMENT"] === 'Y' ? 'Y' : 'N')
			));
		}
	}

	return $commentId;
}