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;
}