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;
}