• Модуль: forum
  • Путь к файлу: ~/bitrix/modules/forum/classes/general/forum_new.php
  • Класс: CAllForumNew
  • Вызов: CAllForumNew::SetStat
static function SetStat($ID = 0, $arParams = array())
{
	global $DB;
	$ID = intval($ID);
	if ($ID <= 0):
		return false;
	endif;
	$arParams = (is_array($arParams) ? $arParams : array());
	$arMessage = (is_array($arParams["MESSAGE"]) ? $arParams["MESSAGE"] : array());
	if ($arMessage["FORUM_ID"] != $ID)
		$arMessage = array();

	$arForum = CForumNew::GetByID($ID);

	$arParams["ACTION"] = isset($arParams["ACTION"]) && ($arParams["ACTION"] == "DECREMENT" || $arParams["ACTION"] == "UPDATE") ? $arParams["ACTION"] : "INCREMENT";
	$arParams["POSTS"] = intval(isset($arParams["POSTS"]) && $arParams["POSTS"] > 0 ? $arParams["POSTS"] : 1);

	$arFields = array();

	if (empty($arMessage))
	{
		// full recount
	}
	elseif ($arParams["ACTION"] == "INCREMENT")
	{
		if ($arMessage["ID"] > $arForum["ABS_LAST_MESSAGE_ID"]):
			$arFields["ABS_LAST_POSTER_ID"] = ((intval($arMessage["AUTHOR_ID"])>0) ? $arMessage["AUTHOR_ID"] : false);
			$arFields["ABS_LAST_POSTER_NAME"] = $arMessage["AUTHOR_NAME"];
			$arFields["ABS_LAST_POST_DATE"] = $arMessage["POST_DATE"];
			$arFields["ABS_LAST_MESSAGE_ID"] = $arMessage["ID"];
			if ($arMessage["APPROVED"] == "Y"):
				$arFields["LAST_POSTER_ID"] = $arFields["ABS_LAST_POSTER_ID"];
				$arFields["LAST_POSTER_NAME"] = $arFields["ABS_LAST_POSTER_NAME"];
				$arFields["LAST_POST_DATE"] = $arFields["ABS_LAST_POST_DATE"];
				$arFields["LAST_MESSAGE_ID"] = $arFields["ABS_LAST_MESSAGE_ID"];
			endif;
		endif;

		if ($arMessage["APPROVED"] == "Y"):
			$arFields["=POSTS"] = "POSTS+1";
			if ($arMessage["NEW_TOPIC"] == "Y"):
				$arFields["=TOPICS"] = "TOPICS+1";
			endif;
		else:
			$arFields["=POSTS_UNAPPROVED"] = "POSTS_UNAPPROVED+1";
		endif;
	}
	elseif ($arMessage["ID"] > $arForum["ABS_LAST_MESSAGE_ID"])
	{
		// full recount
	}
	elseif ($arParams["ACTION"] == "DECREMENT" &&
		($arMessage["ID"] == $arForum["ABS_LAST_MESSAGE_ID"] || $arMessage["ID"] == $arForum["LAST_MESSAGE_ID"]))
	{
		// full recount
	}
	elseif ($arParams["ACTION"] == "DECREMENT")
	{
		if ($arMessage["APPROVED"] == "Y"):
			$arFields["=POSTS"] = "POSTS-1";
			if ($arMessage["NEW_TOPIC"] == "Y"):
				$arFields["=TOPICS"] = "TOPICS-1";
			endif;
		else:
			$arFields["=POSTS_UNAPPROVED"] = "POSTS_UNAPPROVED-1";
		endif;
	}
	elseif ($arParams["ACTION"] == "UPDATE")
	{
		if ($arMessage["APPROVED"] == "Y"):
			if ($arMessage["ID"] > $arForum["LAST_MESSAGE_ID"]):
				$arFields["LAST_POSTER_ID"] = ((intval($arMessage["AUTHOR_ID"])>0) ? $arMessage["AUTHOR_ID"] : false);
				$arFields["LAST_POSTER_NAME"] = $arMessage["AUTHOR_NAME"];
				$arFields["LAST_POST_DATE"] = $arMessage["POST_DATE"];
				$arFields["LAST_MESSAGE_ID"] = $arMessage["ID"];
			endif;
			$arFields["=POSTS"] = "POSTS+1";
			$arFields["=POSTS_UNAPPROVED"] = "POSTS_UNAPPROVED-1";
			if ($arMessage["NEW_TOPIC"] == "Y"):
				$arFields["=TOPICS"] = "TOPICS+1";
			endif;
		elseif ($arMessage["ID"] != $arForum["LAST_MESSAGE_ID"]):
			$arFields["=POSTS"] = "POSTS-1";
			$arFields["=POSTS_UNAPPROVED"] = "POSTS_UNAPPROVED+1";
			if ($arMessage["NEW_TOPIC"] == "Y"):
				$arFields["=TOPICS"] = "TOPICS-1";
			endif;
		endif;
	}

	if (empty($arFields))
	{
		$res = CForumMessage::GetList(array(), array("FORUM_ID" => $ID), "cnt_not_approved");
		$res = (is_array($res) ? $res : array());
		$res["CNT"] = intval($res["CNT"]) - intval($res["CNT_NOT_APPROVED"]);
		$res["CNT"] = ($res["CNT"] > 0 ? $res["CNT"] : 0);

		$arFields = array(
			"TOPICS" => CForumTopic::GetList(array(), array("FORUM_ID" => $ID, "APPROVED" => "Y"), true),
			"POSTS" => $res["CNT"],
			"LAST_POSTER_ID" => false,
			"LAST_POSTER_NAME" => false,
			"LAST_POST_DATE" => false,
			"LAST_MESSAGE_ID" => intval($res["LAST_MESSAGE_ID"]),
			"POSTS_UNAPPROVED" => intval($res["CNT_NOT_APPROVED"]),
			"ABS_LAST_POSTER_ID" => false,
			"ABS_LAST_POSTER_NAME" => false,
			"ABS_LAST_POST_DATE" => false,
			"ABS_LAST_MESSAGE_ID" => intval($res["ABS_LAST_MESSAGE_ID"]));
		if ($arFields["ABS_LAST_MESSAGE_ID"] > 0):
			$res = CForumMessage::GetByID($arFields["ABS_LAST_MESSAGE_ID"], array("FILTER" => "N"));
			$arFields["ABS_LAST_POSTER_ID"] = (intval($res["AUTHOR_ID"]) > 0 ? $res["AUTHOR_ID"] : false);
			$arFields["ABS_LAST_POSTER_NAME"] = $res["AUTHOR_NAME"];
			$arFields["ABS_LAST_POST_DATE"] = $res["POST_DATE"];
			if (intval($arFields["LAST_MESSAGE_ID"]) > 0):
				if ($arFields["LAST_MESSAGE_ID"] < $arFields["ABS_LAST_MESSAGE_ID"]):
					$res = CForumMessage::GetByID($arFields["LAST_MESSAGE_ID"], array("FILTER" => "N"));
				endif;
				$arFields["LAST_POSTER_ID"] = (intval($res["AUTHOR_ID"]) > 0 ? $res["AUTHOR_ID"] : false);
				$arFields["LAST_POSTER_NAME"] = $res["AUTHOR_NAME"];
				$arFields["LAST_POST_DATE"] = $res["POST_DATE"];
			endif;
		endif;
	}

	if (!CForumNew::CheckFields("UPDATE", $arFields))
		return false;

	$strUpdate = $DB->PrepareUpdate("b_forum", $arFields);
	if (!empty($arFields)):
		$res = array();
		foreach ($arFields as $key => $val):
			if (mb_substr($key, 0, 1) == "="):
				$key = mb_substr($key, 1);
				if (!empty($key)):
					$res[] = $key."=".(empty($val) ? $key."+1" : $val);
				endif;
			endif;
		endforeach;
		if (!empty($res)):
			$strUpdate = (empty($strUpdate) ? "" : $strUpdate.",");
			$strUpdate .= implode(", ", $res);
		endif;
	endif;

	if (empty($strUpdate))
		return false;
	$strSql = "UPDATE b_forum SET ".$strUpdate." WHERE ID=".$ID;
	return $DB->Query($strSql, false, "File: ".__FILE__."
Line: ".__LINE__); }