static function addComment(array $params = []): array
{
global $USER, $USER_FIELD_MANAGER;
$result = [];
$logId = (int)($params['logId'] ?? 0);
$currentUserId = (int)($params['currentUserId'] ?? $USER->getId());
$crm = (isset($params['crm']) && $params['crm'] === 'Y' ? 'Y' : 'N');
$languageId = (string)($params['languageId'] ?? LANGUAGE_ID);
$siteId = (string)($params['siteId'] ?? SITE_ID);
$commentParams = (isset($params['commentParams']) && is_array($params['commentParams']) ? $params['commentParams'] : []);
$message = (string)($params['message'] ?? '');
$forumId = (int)($params['forumId'] ?? 0);
$commentUid = (string)($params['commentUid'] ?? '');
$dateTimeFormat = (string)($params['dateTimeFormat'] ?? CSite::getTimeFormat());
$nameTemplate = (string)($params['nameTemplate'] ?? CSite::getNameFormat(null, $siteId));
$showLogin = (string)($params['showLogin'] ?? 'N');
$avatarSize = (int)($params['avatarSize'] ?? 100);
$pull = (string)($params['pull'] ?? 'N');
$decode = (bool)($params['decode'] ?? false);
$pathToSmile = (string)($params['pathToSmile'] ?? '');
$pathToLogEntry = (string)($params['pathToLogEntry'] ?? '');
$pathToUser = (string)($params['pathToUser'] ?? '');
$pathToUserBlogPost = (string)($params['pathToUserBlogPost'] ?? '');
$pathToGroupBlogPost = (string)($params['pathToGroupBlogPost'] ?? '');
$pathToUserMicroBlogPost = (string)($params['pathToUserMicroBlogPost'] ?? '');
$pathToGroupMicroBlogPost = (string)($params['pathToGroupMicroBlogPost'] ?? '');
$blogAllowPostCode = (string)($params['blogAllowPostCode'] ?? 'N');
if ($logId <= 0)
{
return $result;
}
if (!isset($params['currentUserExternalAuthId']))
{
$currentUserExternalAuthId = '';
if ($USER->isAuthorized())
{
$res = CUser::getById($currentUserId);
if ($userFields = $res->fetch())
{
$currentUserExternalAuthId = $userFields['EXTERNAL_AUTH_ID'];
}
}
}
else
{
$currentUserExternalAuthId = '';
}
if ($logFields = CSocNetLog::getById($logId))
{
$listParams = [
'CHECK_RIGHTS' => 'Y',
'USE_SUBSCRIBE' => 'N'
];
if (
$currentUserExternalAuthId !== 'email'
&& mb_strpos($logFields['ENTITY_TYPE'], 'CRM') === 0
&& (
!in_array($logFields['EVENT_ID'], [ 'crm_lead_message', 'crm_deal_message', 'crm_company_message', 'crm_contact_message', 'crm_activity_add' ])
|| $crm === 'Y'
)
&& ModuleManager::isModuleInstalled('crm')
)
{
$listParams = [
'IS_CRM' => 'Y',
'CHECK_CRM_RIGHTS' => 'Y'
];
}
}
else
{
$logId = 0;
}
if (
$logId <= 0
|| !($res = CSocNetLog::GetList(array(), array("ID" => $logId), false, false, array(), $listParams))
|| !($logFields = $res->fetch())
)
{
$result['strMessage'] = Loc::getMessage('SONET_LOG_COMMENT_NO_PERMISSIONS', false, $languageId);
return $result;
}
$commentEvent = CSocNetLogTools::FindLogCommentEventByLogEventID($logFields['EVENT_ID']);
if (!$commentEvent)
{
return $result;
}
$canAddComments = ComponentHelper::canAddComment($logFields, $commentEvent);
if (!$canAddComments)
{
$result['strMessage'] = Loc::getMessage('SONET_LOG_COMMENT_NO_PERMISSIONS', false, $languageId);
return $result;
}
$editCommentSourceId = (
isset($commentParams[1]) && (int)$commentParams[1] > 0
? (int)$commentParams[1]
: 0
);
// add source object and get source_id, $source_url
$options = [
'PATH_TO_SMILE' => $pathToSmile,
'PATH_TO_LOG_ENTRY' => $pathToLogEntry,
'PATH_TO_USER_BLOG_POST' => $pathToUserBlogPost,
'PATH_TO_GROUP_BLOG_POST' => $pathToGroupBlogPost,
'PATH_TO_USER_MICROBLOG_POST' => $pathToUserMicroBlogPost,
'PATH_TO_GROUP_MICROBLOG_POST' => $pathToGroupMicroBlogPost,
'BLOG_ALLOW_POST_CODE' => $blogAllowPostCode,
];
$commentText = preg_replace("/xe2x81xa0/is", ' ', $message); // INVISIBLE_CURSOR from editor
if ($decode)
{
CUtil::decodeURIComponent($commentText);
}
$commentText = trim($commentText);
if ($commentText === '')
{
$result['strMessage'] = Loc::getMessage('SONET_LOG_COMMENT_EMPTY', false, $languageId);
return $result;
}
$searchParams = [];
if ($commentEvent['EVENT_ID'] === 'forum')
{
$searchParams['FORUM_ID'] = $forumId;
$searchParams['PATH_TO_GROUP_FORUM_MESSAGE'] = (
$logFields['ENTITY_TYPE'] === SONET_SUBSCRIBE_ENTITY_GROUP
? static::replaceGroupPath($logFields['URL'], $siteId)
: ''
);
$searchParams['PATH_TO_USER_FORUM_MESSAGE'] = (
$logFields['ENTITY_TYPE'] === SONET_SUBSCRIBE_ENTITY_USER
? $logFields['URL']
: ''
);
}
elseif ($commentEvent['EVENT_ID'] === 'files_comment')
{
$filesForumId = 0;
if ((string)$logFields['PARAMS'] !== '')
{
$logParams = explode('&', htmlspecialcharsback($logFields["PARAMS"]));
foreach ($logParams as $prm)
{
[ $k, $v ] = explode('=', $prm);
if ($k === 'forum_id')
{
$filesForumId = (int)$v;
break;
}
}
}
$searchParams['FILES_FORUM_ID'] = $filesForumId;
$searchParams['PATH_TO_GROUP_FILES_ELEMENT'] = (
$logFields['ENTITY_TYPE'] === SONET_SUBSCRIBE_ENTITY_GROUP
? static::replaceGroupPath($logFields['URL'], $siteId)
: ''
);
$searchParams['PATH_TO_USER_FILES_ELEMENT'] = (
$logFields['ENTITY_TYPE'] === SONET_SUBSCRIBE_ENTITY_USER
? $logFields['URL']
: ''
);
}
elseif ($commentEvent['EVENT_ID'] === 'photo_comment')
{
$photoForumId = 0;
if ((string)$logFields['PARAMS'] !== '')
{
$logParams = unserialize(htmlspecialcharsback($logFields['PARAMS']), [ 'allowed_classes' => false ]);
if (
isset($logParams['FORUM_ID'])
&& (int)$logParams['FORUM_ID'] > 0
)
{
$photoForumId = $logParams["FORUM_ID"];
}
}
$searchParams['PHOTO_FORUM_ID'] = $photoForumId;
$searchParams['PATH_TO_GROUP_PHOTO_ELEMENT'] = (
$logFields['ENTITY_TYPE'] === SONET_SUBSCRIBE_ENTITY_GROUP
? static::replaceGroupPath($logFields['URL'], $siteId)
: ''
);
$searchParams['PATH_TO_USER_PHOTO_ELEMENT'] = (
$logFields['ENTITY_TYPE'] === SONET_SUBSCRIBE_ENTITY_USER
? $logFields['URL']
: ''
);
}
elseif ($commentEvent['EVENT_ID'] === 'wiki_comment')
{
$searchParams['PATH_TO_GROUP_WIKI_POST_COMMENT'] = (
$logFields['ENTITY_TYPE'] === SONET_SUBSCRIBE_ENTITY_GROUP
? Option::get('socialnetwork', 'workgroups_page', '', $siteId) . 'group/#group_id#/wiki/#wiki_name#/?MID=#message_id##message#message_id#'
: ''
);
}
elseif ($commentEvent["EVENT_ID"] === 'tasks_comment')
{
if (Loader::includeModule('tasks'))
{
$tasksForumId = 0;
try
{
$tasksForumId = CTasksTools::getForumIdForIntranet();
}
catch (Exception $e)
{
}
if ($tasksForumId > 0)
{
$searchParams['TASK_FORUM_ID'] = $tasksForumId;
$searchParams['PATH_TO_GROUP_TASK_ELEMENT'] = (
$logFields['ENTITY_TYPE'] === SONET_SUBSCRIBE_ENTITY_GROUP
? Option::get('socialnetwork', 'workgroups_page', '', $siteId) . 'group/#group_id#/tasks/task/view/#task_id#/'
: ''
);
$searchParams['PATH_TO_USER_TASK_ELEMENT'] = (
$logFields['ENTITY_TYPE'] === SONET_SUBSCRIBE_ENTITY_USER
? Option::get('socialnetwork', 'user_page', '', $siteId) . 'user/#user_id#/tasks/task/view/#task_id#/'
: ""
);
}
}
}
elseif ($commentEvent['EVENT_ID'] === 'calendar_comment')
{
$searchParams['PATH_TO_GROUP_CALENDAR_ELEMENT'] = (
$logFields['ENTITY_TYPE'] === SONET_SUBSCRIBE_ENTITY_GROUP
? Option::get('socialnetwork', 'workgroups_page', '', $siteId) . 'group/#group_id#/calendar/?EVENT_ID=#element_id#'
: ''
);
}
elseif ($commentEvent['EVENT_ID'] === 'lists_new_element_comment')
{
$searchParams['PATH_TO_WORKFLOW'] = '/services/processes/#list_id#/bp_log/#workflow_id#/';
}
global $bxSocNetSearch;
if (
!empty($searchParams)
&& !is_object($bxSocNetSearch)
)
{
$bxSocNetSearch = new CSocNetSearch(
($logFields['ENTITY_TYPE'] === SONET_SUBSCRIBE_ENTITY_USER ? $logFields['ENTITY_ID'] : false),
($logFields['ENTITY_TYPE'] === SONET_SUBSCRIBE_ENTITY_GROUP ? $logFields['ENTITY_ID'] : false),
$searchParams
);
AddEventHandler('search', 'BeforeIndex', [ $bxSocNetSearch, 'BeforeIndex' ]);
}
if ($editCommentSourceId > 0)
{
$fields = [
'EVENT_ID' => $commentEvent['EVENT_ID'],
'MESSAGE' => $commentText,
'TEXT_MESSAGE' => $commentText,
'BLOG_ALLOW_POST_CODE' => $options['BLOG_ALLOW_POST_CODE']
];
}
else
{
$fields = [
'ENTITY_TYPE' => $logFields['ENTITY_TYPE'],
'ENTITY_ID' => $logFields['ENTITY_ID'],
'EVENT_ID' => $commentEvent['EVENT_ID'],
'=LOG_DATE' => CDatabase::currentTimeFunction(),
'MESSAGE' => $commentText,
'TEXT_MESSAGE' => $commentText,
'MODULE_ID' => false,
'LOG_ID' => $logFields['ID'],
'USER_ID' => $currentUserId,
'PATH_TO_USER_BLOG_POST' => $options['PATH_TO_USER_BLOG_POST'],
'PATH_TO_GROUP_BLOG_POST' => $options['PATH_TO_GROUP_BLOG_POST'],
'PATH_TO_USER_MICROBLOG_POST' => $options['PATH_TO_USER_MICROBLOG_POST'],
'PATH_TO_GROUP_MICROBLOG_POST' => $options['PATH_TO_GROUP_MICROBLOG_POST'],
'BLOG_ALLOW_POST_CODE' => $options['BLOG_ALLOW_POST_CODE']
];
}
$USER_FIELD_MANAGER->EditFormAddFields('SONET_COMMENT', $fields);
if (
array_key_exists('UF_SONET_COM_FILE', $fields)
&& !empty($fields['UF_SONET_COM_FILE'])
)
{
if (is_array($fields['UF_SONET_COM_FILE']))
{
foreach ($fields["UF_SONET_COM_FILE"] as $key => $fileID)
{
if (
!$commentUid
|| !array_key_exists('MFI_UPLOADED_FILES_' . $commentUid, $_SESSION)
|| !in_array($fileID, $_SESSION['MFI_UPLOADED_FILES_' . $commentUid], true)
)
{
unset($fields['UF_SONET_COM_FILE'][$key]);
}
}
}
elseif (
!$commentUid
|| !array_key_exists('MFI_UPLOADED_FILES_' . $commentUid, $_SESSION)
|| !in_array($fields['UF_SONET_COM_FILE'], $_SESSION['MFI_UPLOADED_FILES_' . $commentUid], true)
)
{
unset($fields['UF_SONET_COM_FILE']);
}
}
$inlineTagList = BitrixSocialnetworkUtil::detectTags($fields, [ 'MESSAGE' ]);
if (!empty($inlineTagList))
{
$fields['TAG'] = $inlineTagList;
}
$updatedCommentId = 0;
if ($editCommentSourceId > 0)
{
$updatedCommentLogId = 0;
$updatedCommentUserId = 0;
if (
isset($commentEvent['ADD_CALLBACK'])
&& is_callable($commentEvent['ADD_CALLBACK'])
)
{
$res = CSocNetLogComments::getList(
[],
[
'EVENT_ID' => $commentEvent['EVENT_ID'],
'SOURCE_ID' => $editCommentSourceId
],
false,
false,
[ 'ID', 'USER_ID', 'LOG_ID', 'SOURCE_ID' ]
);
if ($commentFields = $res->fetch())
{
$updatedCommentId = $commentFields['ID'];
$updatedCommentLogId = $commentFields['LOG_ID'];
$updatedCommentUserId = $commentFields['USER_ID'];
}
}
if ((int)$updatedCommentId <= 0)
{
$res = CSocNetLogComments::getList(
[],
[
'ID' => $editCommentSourceId,
],
false,
false,
[ 'ID', 'USER_ID', 'LOG_ID', 'SOURCE_ID' ]
);
if ($commentFields = $res->fetch())
{
$updatedCommentId = $commentFields['ID'];
$updatedCommentLogId = $commentFields['LOG_ID'];
$updatedCommentUserId = $commentFields['USER_ID'];
}
}
$canUpdate = false;
if ((int)$updatedCommentId > 0)
{
$canUpdate = CSocNetLogComponent::canUserChangeComment(array(
'ACTION' => 'EDIT',
'LOG_ID' => $updatedCommentLogId,
'LOG_EVENT_ID' => $logFields['EVENT_ID'],
'LOG_SOURCE_ID' => $logFields['SOURCE_ID'],
'COMMENT_ID' => $updatedCommentId,
'COMMENT_USER_ID' => $updatedCommentUserId
));
}
if ($canUpdate)
{
$commentId = CSocNetLogComments::update($updatedCommentId, $fields, true);
}
else
{
$result['strMessage'] = Loc::getMessage("SONET_LOG_COMMENT_NO_PERMISSIONS_UPDATE", false, $languageId);
$result["commentText"] = $commentText;
return $result;
}
}
else
{
$commentId = CSocNetLogComments::add($fields, true, false);
}
if ((int)$commentId <= 0)
{
return $result;
}
$bSkipCounterIncrement = false;
if ($editCommentSourceId <= 0)
{
$res = getModuleEvents('socialnetwork', 'OnAfterSocNetLogEntryCommentAdd');
while ($event = $res->fetch())
{
ExecuteModuleEventEx($event, [
$logFields,
[
'SITE_ID' => $siteId,
'COMMENT_ID' => $commentId,
]
]);
}
$res = getModuleEvents('socialnetwork', 'OnBeforeSocNetLogCommentCounterIncrement');
while ($event = $res->fetch())
{
if (ExecuteModuleEventEx($event, [ $logFields ]) === false)
{
$bSkipCounterIncrement = true;
break;
}
}
}
else
{
$bSkipCounterIncrement = true;
}
if (!$bSkipCounterIncrement)
{
CSocNetLog::counterIncrement(
$commentId,
false,
false,
"LC",
CSocNetLogRights::checkForUserAll($logFields['ID'])
);
}
$result['commentID'] = $commentId;
if ($commentFields = CSocNetLogComments::getById($result['commentID']))
{
$res = ComponentHelper::addLiveComment(
$commentFields,
$logFields,
$commentEvent,
[
'ACTION' => ((int)$updatedCommentId <= 0 ? 'ADD' : "UPDATE"),
'SOURCE_ID' => $editCommentSourceId,
'TIME_FORMAT' => $dateTimeFormat,
"PATH_TO_USER" => $pathToUser,
'PATH_TO_LOG_ENTRY' => $pathToLogEntry,
'NAME_TEMPLATE' => $nameTemplate,
'SHOW_LOGIN' => $showLogin,
'AVATAR_SIZE' => $avatarSize,
'PATH_TO_SMILE' => $pathToSmile,
'LANGUAGE_ID' => $languageId,
'SITE_ID' => $siteId,
'PULL' => $pull,
]
);
$result = array_merge($result, $res);
}
return $result;
}