• Модуль: forum
  • Путь к файлу: ~/bitrix/modules/forum/classes/general/message.php
  • Класс: CAllForumMessage
  • Вызов: CAllForumMessage::Update
static function Update($ID, $arFields, $skip_counts = false, $strUploadDir = false)
{
	global $DB, $USER_FIELD_MANAGER;
	$ID = intval($ID);
	$strSql = "";
	$strUploadDir = ($strUploadDir === false ? "forum" : $strUploadDir);

	if ($ID <= 0 || !CForumMessage::CheckFields("UPDATE", $arFields, $ID) || empty($arFields))
		return false;

//		if (!$skip_counts || IsModuleInstalled("search") || is_array($arFields["ATTACH_IMG"]) || is_array($arFields["FILES"]))
//		{
		$arMessage_prev = CForumMessage::GetByID($ID, array("FILTER" => "N"));
//		}

	if 	(is_set($arFields, "POST_MESSAGE") || is_set($arFields, "FORUM_ID"))
	{
		$arFields["POST_MESSAGE_HTML"] = '';
		$arFields["POST_MESSAGE_FILTER"] = '';
	}
	$arr = array(
		"AUTHOR_NAME" => $arMessage_prev["AUTHOR_NAME"],
		"AUTHOR_EMAIL" => $arMessage_prev["AUTHOR_EMAIL"],
		"EDITOR_NAME" => $arMessage_prev["EDITOR_NAME"],
		"EDITOR_EMAIL" => $arMessage_prev["EDITOR_EMAIL"],
		"EDIT_REASON" => $arMessage_prev["EDIT_REASON"]);
	$bUpdateHTML = false;
	foreach ($arr as $key => $val):
		if (is_set($arFields, $key) && $val != $arFields[$key]):
			$bUpdateHTML = true;
			break;
		endif;
	endforeach;
	if ($bUpdateHTML):
		$arFields["HTML"] = '';
	endif;

	if (is_set($arFields, "POST_DATE") && (trim($arFields["POST_DATE"]) == ''))
	{
		$strSql = ", POST_DATE=".$DB->GetNowFunction();
		unset($arFields["POST_DATE"]);
	}

	if (!is_set($arFields, "EDIT_DATE"))
	{
		$strSql .= ", EDIT_DATE=".$DB->GetNowFunction();
	}
	else
	{
		if (trim($arFields["EDIT_DATE"]) == '')
		{
			$strSql .= ", EDIT_DATE=".$DB->GetNowFunction();
			unset($arFields["EDIT_DATE"]);
		}
	}
/***************** Event onBeforeMessageUpdate *********************/
	foreach (GetModuleEvents("forum", "onBeforeMessageUpdate", true) as $arEvent)
	{
		if (ExecuteModuleEventEx($arEvent, array(&$ID, &$arFields, &$strUploadDir)) === false)
			return false;
	}
/***************** /Event ******************************************/
/***************** Attach ******************************************/
	$arFiles = array();
	if (is_array($arFields["ATTACH_IMG"]))
		$arFields["FILES"] = array($arFields["ATTACH_IMG"]);
	unset($arFields["ATTACH_IMG"]);
	if (is_array($arFields["FILES"]) && !empty($arFields["FILES"]))
	{
		$res = array("FORUM_ID" => $arMessage_prev["FORUM_ID"],
			"TOPIC_ID" => $arMessage_prev["TOPIC_ID"],
			"MESSAGE_ID" => $ID,
			"USER_ID" => $arFields["EDITOR_ID"], "upload_dir" => $strUploadDir);
		$arFiles = CForumFiles::Save($arFields["FILES"], $res, false);
		$db_res = CForumFiles::GetList(array("ID" => "ASC"), array("MESSAGE_ID" => $ID));
		if ($db_res && $res = $db_res->Fetch())
		{
			do
			{
				$arFiles[$res["FILE_ID"]] = $res;
			} while ($db_res && $res = $db_res->Fetch());
		}
		if (!empty($arFiles))
		{
			$arFiles = array_keys($arFiles);
			sort($arFiles);
			$arFields["ATTACH_IMG"] = $arFiles[0];
		}
		else
		{
			$arFields["ATTACH_IMG"] = 0;
		}
		unset($arFields["FILES"]);
	}
/***************** Attach/******************************************/
	if (empty($arFields) && empty($strSql))
		return false;
	$strUpdate = $DB->PrepareUpdate("b_forum_message", $arFields, $strUploadDir);
	$strSql = "UPDATE b_forum_message SET ".$strUpdate.$strSql." WHERE ID = ".$ID;

	$DB->QueryBind($strSql,
		array("POST_MESSAGE" => $arFields["POST_MESSAGE"],
			"POST_MESSAGE_HTML" => $arFields["POST_MESSAGE_HTML"],
			"POST_MESSAGE_FILTER" => $arFields["POST_MESSAGE_FILTER"],
			"EDIT_REASON" => $arFields["EDIT_REASON"],
			"HTML" => $arFields["HTML"]));
/***************** Attach ******************************************/
	if (!empty($arFiles))
	{
		$res = array(
			"FORUM_ID" => (is_set($arFields, "FORUM_ID") ? $arFields["FORUM_ID"] : $arMessage_prev["FORUM_ID"]),
			"TOPIC_ID" => (is_set($arFields, "TOPIC_ID") ? $arFields["TOPIC_ID"] : $arMessage_prev["TOPIC_ID"]),
			"MESSAGE_ID" => $ID);
		CForumFiles::UpdateByID($arFiles, $res);
	}
/***************** Attach/******************************************/
	$USER_FIELD_MANAGER->Update("FORUM_MESSAGE", $ID, $arFields, (array_key_exists("USER_ID", $arFields) ? $arFields["USER_ID"] : false));
/***************** Event onAfterMessageUpdate **********************/
	foreach (GetModuleEvents("forum", "onAfterMessageUpdate", true) as $arEvent)
		ExecuteModuleEventEx($arEvent, array(&$ID, &$arFields, $arMessage_prev));
/***************** /Event ******************************************/
	unset($GLOBALS["FORUM_CACHE"]["MESSAGE"][$ID]);
	unset($GLOBALS["FORUM_CACHE"]["MESSAGE_FILTER"][$ID]);

	if (!$skip_counts || IsModuleInstalled("search"))
	{
		$arMessage = CForumMessage::GetByIDEx($ID, array("GET_TOPIC_INFO" => "Y", "GET_FORUM_INFO" => "Y", "FILTER" => "Y"));
		if (!$skip_counts)
		{
			// author
			if ($arMessage["AUTHOR_ID"] != $arMessage_prev["AUTHOR_ID"]):
				CForumUser::SetStat($arMessage_prev["AUTHOR_ID"], array("MESSAGE" => $arMessage_prev, "ACTION" => "DECREMENT"));
				CForumUser::SetStat($arMessage["AUTHOR_ID"], array("MESSAGE" => $arMessage, "ACTION" => "INCREMENT"));
			endif;

			// Topic
			if ($arMessage["TOPIC_ID"] != $arMessage_prev["TOPIC_ID"]):
				CForumTopic::SetStat($arMessage_prev["TOPIC_ID"]);
				CForumTopic::SetStat($arMessage["TOPIC_ID"]);
			endif;

			// Forum
			if ($arMessage["FORUM_ID"] != $arMessage_prev["FORUM_ID"]):
				CForumNew::SetStat($arMessage_prev["FORUM_ID"], array("MESSAGE" => $arMessage_prev, "ACTION" => "DECREMENT"));
				CForumNew::SetStat($arMessage["FORUM_ID"], array("MESSAGE" => $arMessage, "ACTION" => "INCREMENT"));
			endif;

			if ($arMessage["APPROVED"] != $arMessage_prev["APPROVED"]):
				if ($arMessage["AUTHOR_ID"] == $arMessage_prev["AUTHOR_ID"]):
					CForumUser::SetStat($arMessage["AUTHOR_ID"], array("MESSAGE" => $arMessage, "ACTION" => "UPDATE"));
				endif;
				if ($arMessage["TOPIC_ID"] == $arMessage_prev["TOPIC_ID"]):
					CForumTopic::SetStat($arMessage["TOPIC_ID"]);
				endif;
				if ($arMessage["FORUM_ID"] == $arMessage_prev["FORUM_ID"]):
					CForumNew::SetStat($arMessage["FORUM_ID"], array("MESSAGE" => $arMessage, "ACTION" => "UPDATE"));
				endif;
				$bUpdatedStatistic = true;
			endif;
		}
		$arForum = CForumNew::GetByID($arMessage["FORUM_ID"]);
		if (CModule::IncludeModule("search") && $arForum["INDEXATION"] == "Y")
		{
			// if message was removed from indexing forum to no-indexing forum we must delete index
			if ($arMessage_prev["FORUM_INFO"]["INDEXATION"] == "Y" &&
				$arMessage["FORUM_INFO"]["INDEXATION"] != "Y")
			{
				CSearch::DeleteIndex("forum", $ID);
			}
			elseif ($arMessage["FORUM_INFO"]["INDEXATION"] == "Y" &&
				$arMessage_prev["APPROVED"] != "N" && $arMessage["APPROVED"] == "N")
			{
				CSearch::DeleteIndex("forum", $ID);
			}
			elseif ($arMessage["APPROVED"] == "Y")
			{
				CForumMessage::Reindex($ID, $arMessage);
			}
		}
	}
	return $ID;
}