• Модуль: socialnetwork
  • Путь к файлу: ~/bitrix/modules/socialnetwork/lib/component/logentry.php
  • Класс: BitrixSocialnetworkComponentLogEntry
  • Вызов: LogEntry::addComment
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;
}