- Модуль: 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__);
}