• Модуль: socialnetwork
  • Путь к файлу: ~/bitrix/modules/socialnetwork/classes/general/log_tools.php
  • Класс: CSocNetLogTools
  • Вызов: CSocNetLogTools::AddComment_Tasks
static function AddComment_Tasks($arFields)
{
	global $USER, $USER_FIELD_MANAGER;

	if (!CModule::IncludeModule("forum"))
		return false;

	if (!CModule::IncludeModule("tasks"))
		return false;

	$sError = '';
	$sNote = '';
	$messageID = $ufUrlPreview = false;

	$arFieldsMessage = array();
	$ufFileID = array();
	$ufDocID = array();

	$dbResult = CSocNetLog::GetList(
		array(),
		array("ID" => $arFields["LOG_ID"]),
		false,
		false,
		array("ID", "SOURCE_ID", "SITE_ID")
	);

	if ($arLog = $dbResult->Fetch())
	{
		$rsTask = CTasks::getById($arLog["SOURCE_ID"]);
		if ($arTask = $rsTask->Fetch())
		{
			$forumID = BitrixTasksIntegrationSocialNetworkTask::getCommentForumId();
			if ($forumID)
			{
				$userID = $USER->GetID();

				/////////////////////////////////////////
				// file prop & UF_* forwarding

				$arLogSites = array();
				$rsLogSite = CSocNetLog::GetSite($arLog["ID"]);
				while ($arLogSite = $rsLogSite->Fetch())
					$arLogSites[] = $arLogSite["LID"];

				$bCurrentUserIsAdmin = CSocNetUser::isCurrentUserModuleAdmin($arLogSites);
				$strPermission = false;

				if ($arFields["ENTITY_TYPE"] == SONET_ENTITY_GROUP)
				{
					if (CSocNetFeaturesPerms::CanPerformOperation($userID, SONET_ENTITY_GROUP, $arFields["ENTITY_ID"], "tasks", "view", $bCurrentUserIsAdmin))
						$strPermission = "I";
				}
				else
				{
					if (
						CModule::IncludeModule('tasks')
						&& BitrixTasksAccessTaskAccessController::can($userID, BitrixTasksAccessActionDictionary::ACTION_TASK_READ, (int) $arTask['ID'])
					)
					{
						$strPermission = "I";
					}
				}

				$arFieldsMessage = array(
					"POST_MESSAGE" => $arFields["TEXT_MESSAGE"],
					"USE_SMILES" => "Y",
					"PERMISSION_EXTERNAL" => "Q",
					"PERMISSION" => $strPermission,
					"APPROVED" => "Y"
				);

				$USER_FIELD_MANAGER->EditFormAddFields("SONET_COMMENT", $arTmp);
				if (is_array($arTmp))
				{
					if (array_key_exists("UF_SONET_COM_DOC", $arTmp))
					{
						$GLOBALS["UF_FORUM_MESSAGE_DOC"] = $arTmp["UF_SONET_COM_DOC"];
					}
					elseif (array_key_exists("UF_SONET_COM_FILE", $arTmp))
					{
						$arFieldsMessage["FILES"] = array();
						foreach($arTmp["UF_SONET_COM_FILE"] as $file_id)
						{
							$arFieldsMessage["FILES"][] = array("FILE_ID" => $file_id);
						}
					}

					if (array_key_exists("UF_SONET_COM_URL_PRV", $arTmp))
					{
						$GLOBALS["UF_FORUM_MES_URL_PRV"] = $arTmp["UF_SONET_COM_URL_PRV"];
					}
				}

				// file prop & UF_* forwarding END
				/////////////////////////////////////////

				$feed = new BitrixForumCommentsFeed(
					$forumID,
					array(
						"type" => "TK",
						"id" => $arTask['ID'],
						"xml_id" => "TASK_".$arTask['ID']
					),
					(
						is_object($USER)
						&& $USER instanceof CUser
							? $USER->getId()
							: (isset($arFields['CURRENT_USER_ID']) ? $arFields['CURRENT_USER_ID'] : 0)
					)
				);

				BitrixTasksIntegrationSocialNetwork::disable(); // disable socnet on comment add to avoid recursion
				$message = $feed->add($arFieldsMessage);
				BitrixTasksIntegrationSocialNetwork::enable(); // enable it back

				if(is_array($message))
				{
					$messageID = $message['ID'];
				}
				else
				{
					foreach($feed->getErrors() as $error)
					{
						$sError .= $error->getMessage();
					}
				}

				// get UF DOC value and FILE_ID there
				if ($messageID > 0)
				{
					// legacy files? will it work?
					$dbAddedMessageFiles = CForumFiles::GetList(array("ID" => "ASC"), array("MESSAGE_ID" => $messageID));
					while ($arAddedMessageFiles = $dbAddedMessageFiles->Fetch())
						$ufFileID[] = $arAddedMessageFiles["FILE_ID"];

					// files in UF_*
					$ufDocID = $USER_FIELD_MANAGER->GetUserFieldValue("FORUM_MESSAGE", "UF_FORUM_MESSAGE_DOC", $messageID, LANGUAGE_ID);
					$ufUrlPreview = $USER_FIELD_MANAGER->GetUserFieldValue("FORUM_MESSAGE", "UF_FORUM_MES_URL_PRV", $messageID, LANGUAGE_ID);
				}

				if ($messageID && ($arMessage = CForumMessage::GetByID($messageID)))
				{
					CSocNetLog::Update(
						$arFields["LOG_ID"],
						array(
							'PARAMS' => serialize(array('TYPE' => 'comment'))
						)
					);
				}
			}
		}
	}

	return array(
		"SOURCE_ID" => $messageID,
		"MESSAGE" => (!empty($arFieldsMessage) ? $arFieldsMessage["POST_MESSAGE"] : false),
		"RATING_TYPE_ID" => "FORUM_POST",
		"RATING_ENTITY_ID" => $messageID,
		"ERROR" => $sError,
		"NOTES" => $sNote,
		"UF" => array(
			"FILE" => $ufFileID,
			"DOC" => $ufDocID,
			"URL_PREVIEW" => $ufUrlPreview
		),
		"URL" => false
	);
}