Current Path : /var/www/www-root/data/www/monolith-realty.ru/bitrix/modules/forum/classes/general/ |
Current File : /var/www/www-root/data/www/monolith-realty.ru/bitrix/modules/forum/classes/general/forum_new.php |
<?php ############################################## # Bitrix Site Manager Forum # # Copyright (c) 2002-2009 Bitrix # # https://www.bitrixsoft.com # # mailto:admin@bitrixsoft.com # ############################################## use \Bitrix\Main; use \Bitrix\Forum; IncludeModuleLangFile(__FILE__); /**********************************************************************/ /************** FORUM *************************************************/ /**********************************************************************/ class CAllForumNew { //---------------> Forum insert, update, delete public static function CanUserViewForum($FID, $arUserGroups, $ExternalPermission = false) { $FID = intval($FID); $arUserGroups = (!is_array($arUserGroups) ? array($arUserGroups) : $arUserGroups); if ($ExternalPermission === false && CForumUser::IsAdmin($arUserGroups)): return true; endif; $strPerms = ($ExternalPermission == false ? CForumNew::GetUserPermission($FID, $arUserGroups) : $ExternalPermission); if ($strPerms >= "Y") return true; $arForum = CForumNew::GetByID($FID); if (!is_array($arForum) || $arForum["ACTIVE"] != "Y"): return false; endif; return ($strPerms < "E" ? false : true); } public static function CanUserAddForum($arUserGroups, $iUserID = 0) { $arUserGroups = (!is_array($arUserGroups) ? array($arUserGroups) : $arUserGroups); return CForumUser::IsAdmin($arUserGroups); } public static function CanUserUpdateForum($FID, $arUserGroups, $iUserID = 0, $ExternalPermission = false) { $FID = intval($FID); if ($ExternalPermission === false && CForumUser::IsAdmin($arUserGroups)): return true; elseif (!CForumUser::IsLocked($iUserID)): $strPerms = ($ExternalPermission == false ? CForumNew::GetUserPermission($FID, $arUserGroups) : $ExternalPermission); else: $strPerms = CForumNew::GetPermissionUserDefault($FID, $arUserGroups); endif; return ($strPerms < "Y" ? false : true); } public static function CanUserDeleteForum($FID, $arUserGroups, $iUserID = 0, $ExternalPermission = false) { $FID = intval($FID); $arUserGroups = (!is_array($arUserGroups) ? array($arUserGroups) : $arUserGroups); if ($ExternalPermission === false && CForumUser::IsAdmin($arUserGroups)): return true; elseif (!CForumUser::IsLocked($iUserID)): $strPerms = ($ExternalPermission == false ? CForumNew::GetUserPermission($FID, $arUserGroups) : $ExternalPermission); else: $strPerms = CForumNew::GetPermissionUserDefault($FID); endif; return ($strPerms < "Y" ? false : true); } public static function CanUserModerateForum($FID, $arUserGroups, $iUserID = 0, $ExternalPermission = false) { $FID = intval($FID); $arUserGroups = (!is_array($arUserGroups) ? array($arUserGroups) : $arUserGroups); if ($ExternalPermission === false && CForumUser::IsAdmin($arUserGroups)): return true; elseif (!CForumUser::IsLocked($iUserID)): $strPerms = ($ExternalPermission == false ? CForumNew::GetUserPermission($FID, $arUserGroups) : $ExternalPermission); else: $strPerms = CForumNew::GetPermissionUserDefault($FID); endif; if ($strPerms >= "Y"): return true; endif; $arForum = CForumNew::GetByID($FID); if (!is_array($arForum) || $arForum["ACTIVE"] != "Y"): return false; endif; return ($strPerms < "Q" ? false : true); } public static function CanUserEditForum($FID, $arUserGroups, $iUserID = 0, $ExternalPermission = false) { $FID = intval($FID); $arUserGroups = (!is_array($arUserGroups) ? array($arUserGroups) : $arUserGroups); if ($ExternalPermission === false && CForumUser::IsAdmin($arUserGroups)): return true; elseif (!CForumUser::IsLocked($iUserID)): $strPerms = ($ExternalPermission == false ? CForumNew::GetUserPermission($FID, $arUserGroups) : $ExternalPermission); else: $strPerms = CForumNew::GetPermissionUserDefault($FID); endif; if ($strPerms >= "Y"): return true; endif; $arForum = CForumNew::GetByID($FID); if (!is_array($arForum) || $arForum["ACTIVE"] != "Y"): return false; endif; return ($strPerms < "U" ? false : true); } public static function CheckFields($ACTION, &$arFields) { $aMsg = array(); if (is_set($arFields, "NAME") || $ACTION == "ADD") { $arFields["NAME"] = trim($arFields["NAME"]); if (empty($arFields["NAME"])) $aMsg[] = array( "id" => "NAME", "text" => GetMessage("F_ERROR_EMPTY_NAME")); } if (!is_set($arFields, "SITES") && is_set($arFields, "LID")) { if (is_set($arFields, "PATH2FORUM_MESSAGE")) $arFields["SITES"] = Array($arFields["LID"] => $arFields["PATH2FORUM_MESSAGE"]); else { $sPath = "/"; $db_res = CSite::GetByID($arFields["LID"]); if ($db_res && $res = $db_res->Fetch()) $sPath = $res["DIR"]; $arFields["SITES"] = array( $arFields["LID"] => $sPath.(COption::GetOptionString("forum", "REL_FPATH", "")). "forum/read.php?FID=#FORUM_ID#&TID=#TOPIC_ID#&MID=#MESSAGE_ID##message#MESSAGE_ID#"); } } if (isset($arFields["SITES"]) || $ACTION == "ADD") { $oldForumSites = is_array($arFields["SITES"]) ? $arFields["SITES"] : []; $newForumSites = []; $dbSites = CSite::GetList(); while ($res = $dbSites->Fetch()) { $siteId = $res["LID"]; if (isset($oldForumSites[$siteId])) { if (!empty($oldForumSites[$siteId])) { $newForumSites[$siteId] = $oldForumSites[$siteId]; } else { $aMsg[] = [ "id" => "SITE_PATH[".$siteId."]", "text" => GetMessage("F_ERROR_EMPTY_SITE_PATH", ["#SITE_ID#" => $siteId, "#SITE_NAME#" => $res["NAME"]]) ]; } } } $arFields["SITES"] = $newForumSites; } if(!empty($aMsg)) { $e = new CAdminException(array_reverse($aMsg)); $GLOBALS["APPLICATION"]->ThrowException($e); return false; } if (is_set($arFields, "SORT") || $ACTION=="ADD") $arFields["SORT"] = intval(intVal($arFields["SORT"]) <= 0 ? 100 : $arFields["SORT"]); if (is_set($arFields, "FORUM_GROUP_ID") || $ACTION=="ADD") $arFields["FORUM_GROUP_ID"] = (intval($arFields["FORUM_GROUP_ID"]) <= 0 ? false : intval($arFields["FORUM_GROUP_ID"])); if (is_set($arFields, "ACTIVE") || $ACTION=="ADD") $arFields["ACTIVE"] = ($arFields["ACTIVE"] == "Y" ? "Y" : "N"); if (is_set($arFields, "INDEXATION") || $ACTION=="ADD") $arFields["INDEXATION"] = ($arFields["INDEXATION"] == "N" ? "N" : "Y"); if (is_set($arFields, "DEDUPLICATION") || $ACTION=="ADD") $arFields["DEDUPLICATION"] = ($arFields["DEDUPLICATION"] == "N" ? "N" : "Y"); if (is_set($arFields, "MODERATION") || $ACTION=="ADD") $arFields["MODERATION"] = ($arFields["MODERATION"] == "Y" ? "Y" : "N"); if (is_set($arFields, "ALLOW_HTML") || $ACTION=="ADD") $arFields["ALLOW_HTML"] = ($arFields["ALLOW_HTML"] == "Y" ? "Y" : "N"); if (is_set($arFields, "ALLOW_ANCHOR") || $ACTION=="ADD") $arFields["ALLOW_ANCHOR"] = ($arFields["ALLOW_ANCHOR"] == "N" ? "N" : "Y"); if (is_set($arFields, "ALLOW_BIU") || $ACTION=="ADD") $arFields["ALLOW_BIU"] = ($arFields["ALLOW_BIU"] == "N" ? "N" : "Y"); if (is_set($arFields, "ALLOW_IMG") || $ACTION=="ADD") $arFields["ALLOW_IMG"] = ($arFields["ALLOW_IMG"] == "N" ? "N" : "Y"); if (is_set($arFields, "ALLOW_VIDEO") || $ACTION=="ADD") $arFields["ALLOW_VIDEO"] = ($arFields["ALLOW_VIDEO"] == "N" ? "N" : "Y"); if (is_set($arFields, "ALLOW_LIST") || $ACTION=="ADD") $arFields["ALLOW_LIST"] = ($arFields["ALLOW_LIST"] == "N" ? "N" : "Y"); if (is_set($arFields, "ALLOW_QUOTE") || $ACTION=="ADD") $arFields["ALLOW_QUOTE"] = ($arFields["ALLOW_QUOTE"] == "N" ? "N" : "Y"); if (is_set($arFields, "ALLOW_CODE") || $ACTION=="ADD") $arFields["ALLOW_CODE"] = ($arFields["ALLOW_CODE"] == "N" ? "N" : "Y"); if (is_set($arFields, "ALLOW_FONT") || $ACTION=="ADD") $arFields["ALLOW_FONT"] = ($arFields["ALLOW_FONT"] == "N" ? "N" : "Y"); if (is_set($arFields, "ALLOW_TABLE") || $ACTION=="ADD") $arFields["ALLOW_TABLE"] = ($arFields["ALLOW_TABLE"] == "N" ? "N" : "Y"); if (is_set($arFields, "ALLOW_ALIGN") || $ACTION=="ADD") $arFields["ALLOW_ALIGN"] = ($arFields["ALLOW_ALIGN"] == "N" ? "N" : "Y"); if (is_set($arFields, "ALLOW_SMILES") || $ACTION=="ADD") $arFields["ALLOW_SMILES"] = ($arFields["ALLOW_SMILES"] == "N" ? "N" : "Y"); if (is_set($arFields, "ALLOW_UPLOAD") || $ACTION=="ADD") $arFields["ALLOW_UPLOAD"] = (in_array($arFields["ALLOW_UPLOAD"], array("Y", "F", "A")) ? $arFields["ALLOW_UPLOAD"] : "N"); if (is_set($arFields, "ALLOW_NL2BR") || $ACTION=="ADD") $arFields["ALLOW_NL2BR"] = ($arFields["ALLOW_NL2BR"] == "Y" ? "Y" : "N"); if (is_set($arFields, "ALLOW_TOPIC_TITLED") || $ACTION=="ADD") $arFields["ALLOW_TOPIC_TITLED"] = ($arFields["ALLOW_TOPIC_TITLED"] == "Y" ? "Y" : "N"); if (is_set($arFields, "ALLOW_MOVE_TOPIC") || $ACTION=="ADD") $arFields["ALLOW_MOVE_TOPIC"] = ($arFields["ALLOW_MOVE_TOPIC"] == "Y" ? "Y" : "N"); if (is_set($arFields, "ALLOW_SIGNATURE") || $ACTION=="ADD") $arFields["ALLOW_SIGNATURE"] = ($arFields["ALLOW_SIGNATURE"] == "Y" ? "Y" : "N"); if (is_set($arFields, "ASK_GUEST_EMAIL") || $ACTION=="ADD") $arFields["ASK_GUEST_EMAIL"] = ($arFields["ASK_GUEST_EMAIL"] == "Y" ? "Y" : "N"); if (is_set($arFields, "ASK_GUEST_EMAIL") || $ACTION=="ADD") $arFields["ASK_GUEST_EMAIL"] = ($arFields["ASK_GUEST_EMAIL"] == "Y" ? "Y" : "N"); if (is_set($arFields, "LAST_POSTER_NAME") && COption::GetOptionString("forum", "FILTER", "Y") == "Y") { $arr = array("LAST_POSTER_NAME" => CFilterUnquotableWords::Filter($arFields["LAST_POSTER_NAME"])); $arr["LAST_POSTER_NAME"] = (empty($arr["LAST_POSTER_NAME"]) ? "*" : $arr["LAST_POSTER_NAME"]); $arFields["HTML"] = serialize($arr); } return true; } public static function Update($ID, $arFields, $bReindex = true) { global $DB; $ID = intval($ID); $arForum_prev = array(); $arProcAuth = array(); if ($ID <= 0 || !CForumNew::CheckFields("UPDATE", $arFields)) return false; if ($arFields["ACTIVE"] == "N") $arForum_prev = CForumNew::GetByID($ID); /***************** Event onBeforeForumUpdate ***********************/ foreach (GetModuleEvents("forum", "onBeforeForumUpdate", true) as $arEvent) { if (ExecuteModuleEventEx($arEvent, array(&$ID, &$arFields)) === false) return false; } /***************** /Event ******************************************/ if (empty($arFields)) return false; /***************** Cleaning cache **********************************/ unset($GLOBALS["FORUM_CACHE"]["FORUM"][$ID]); if(CACHED_b_forum !== false) $GLOBALS["CACHE_MANAGER"]->CleanDir("b_forum"); if(CACHED_b_forum2site !== false && is_array($arFields["SITES"]) && count($arFields["SITES"]) > 0) $GLOBALS["CACHE_MANAGER"]->CleanDir("b_forum2site"); /***************** Cleaning cache/**********************************/ $strUpdate = $DB->PrepareUpdate("b_forum", $arFields); if (!empty($strUpdate)) { $strSql = "UPDATE b_forum SET ".$strUpdate." WHERE ID=".$ID; $DB->Query($strSql); } if (is_array($arFields["SITES"]) && count($arFields["SITES"]) > 0) { $DB->Query("DELETE FROM b_forum2site WHERE FORUM_ID = ".$ID); foreach ($arFields["SITES"] as $key => $value) { $value = $DB->ForSql($value, 250); $strSql = "INSERT INTO b_forum2site (FORUM_ID, SITE_ID, PATH2FORUM_MESSAGE) VALUES(".$ID.", '".$DB->ForSql($key, 2)."', '".$value."') "; if ($DB->type == "MYSQL") $strSql .= "ON DUPLICATE KEY UPDATE PATH2FORUM_MESSAGE='".$value."'"; $DB->Query($strSql); } } if (is_set($arFields, "GROUP_ID") && is_array($arFields["GROUP_ID"])) CForumNew::SetAccessPermissions($ID, $arFields["GROUP_ID"]); /***************** Event onAfterForumUpdate ************************/ foreach (GetModuleEvents("forum", "onAfterForumUpdate", true) as $arEvent) ExecuteModuleEventEx($arEvent, array($ID, $arFields)); /***************** /Event ******************************************/ /***************** Update statistic ********************************/ /* If forum became inactive than all statistics for users of this forum will be recalculated.*/ if ($arFields["ACTIVE"] == "N" && $arForum_prev["ACTIVE"] == "Y") { $db_res = CForumMessage::GetList(array(), array("FORUM_ID"=>$ID, "!AUTHOR_ID"=>0)); while ($res = $db_res->Fetch()) { $res["AUTHOR_ID"] = intval($res["AUTHOR_ID"]); if (!in_array($res["AUTHOR_ID"], $arProcAuth)) { CForumUser::SetStat($res["AUTHOR_ID"]); $arProcAuth[] = $res["AUTHOR_ID"]; } } unset($arProcAuth); } /***************** Update search module ****************************/ if (CModule::IncludeModule("search") && $bReindex == true) { if ($arFields["ACTIVE"] == "N" && $arForum_prev["ACTIVE"] == "Y" || $arFields["INDEXATION"] == "N" && $arForum_prev["INDEXATION"] == "Y") { CSearch::DeleteIndex("forum", false, $ID); } elseif (is_set($arFields, "GROUP_ID") && is_array($arFields["GROUP_ID"])) { $arGroups = CForumNew::GetAccessPermissions($ID); $arGPerm = Array(); foreach ($arGroups as $i => $group) { if ($group[1] >= "E") { $arGPerm[] = $group[0]; if ($group[0] == 2) break; } } CSearch::ChangePermission("forum", $arGPerm, false, $ID); } } return $ID; } public static function Delete($ID) { global $DB; $ID = intval($ID); $bCanDelete = true; /***************** Event OnBeforeForumDelete ***********************/ foreach (GetModuleEvents("forum", "OnBeforeForumDelete", true) as $arEvent) { if (ExecuteModuleEventEx($arEvent, array(&$ID)) === false) { $bCanDelete = false; break; } } /***************** /Event ******************************************/ if (!$bCanDelete) return false; /***************** Event OnForumDelete *****************************/ foreach (GetModuleEvents("forum", "OnForumDelete", true) as $arEvent) ExecuteModuleEventEx($arEvent, array(&$ID)); /***************** /Event ******************************************/ /***************** Cleaning cache **********************************/ unset($GLOBALS["FORUM_CACHE"]["FORUM"][$ID]); if(CACHED_b_forum !== false) $GLOBALS["CACHE_MANAGER"]->CleanDir("b_forum"); if(CACHED_b_forum_perms !== false) $GLOBALS["CACHE_MANAGER"]->CleanDir("b_forum_perms"); if(CACHED_b_forum2site !== false) $GLOBALS["CACHE_MANAGER"]->CleanDir("b_forum2site"); /***************** Cleaning cache/**********************************/ /***************** Search module ***********************************/ set_time_limit(0); if (CModule::IncludeModule("search")) { CSearch::DeleteIndex("forum", false, $ID); } CForumFiles::Delete(array("FORUM_ID" => $ID), array("DELETE_FORUM_FILE" => "Y")); $DB->StartTransaction(); // Update USER statistic $arProcAuth = array(); $db_res = CForumMessage::GetList(array(), array("FORUM_ID"=>$ID, "!AUTHOR_ID"=>0)); while ($res = $db_res->Fetch()) { $res["AUTHOR_ID"] = intval($res["AUTHOR_ID"]); if (!in_array($res["AUTHOR_ID"], $arProcAuth)) { $arProcAuth[] = intval($res["AUTHOR_ID"]); } } if (IsModuleInstalled("vote")) { $db_res = CForumMessage::GetList(array(), array("FORUM_ID"=>$ID, "PARAM1" => "VT", "!PARAM2" => 0)); if ($db_res && $res = $db_res->Fetch()): CModule::IncludeModule("vote"); do { CVote::Delete($res["PARAM2"]); } while ($res = $db_res->Fetch()); endif; } if (!$DB->Query("DELETE FROM b_forum_subscribe WHERE FORUM_ID=".$ID, true)) { $DB->Rollback(); return false; } if (!$DB->Query("DELETE FROM b_forum_message WHERE FORUM_ID=".$ID, true)) { $DB->Rollback(); return false; } if (!$DB->Query("DELETE FROM b_forum_topic WHERE FORUM_ID=".$ID, true)) { $DB->Rollback(); return false; } if (!$DB->Query("DELETE FROM b_forum_perms WHERE FORUM_ID=".$ID, true)) { $DB->Rollback(); return false; } if (!$DB->Query("DELETE FROM b_forum2site WHERE FORUM_ID=".$ID, true)) { $DB->Rollback(); return false; } if (!$DB->Query("DELETE FROM b_forum WHERE ID=".$ID, true)) { $DB->Rollback(); return false; } // Update USER statistic foreach($arProcAuth as $i => $procAuth) CForumUser::SetStat($procAuth); $DB->Commit(); /***************** Event OnAfterForumDelete ************************/ foreach (GetModuleEvents("forum", "OnAfterForumDelete", true) as $arEvent) ExecuteModuleEventEx($arEvent, array($ID)); /***************** /Event ******************************************/ return true; } //---------------> Array of sites (langs) where forum is available public static function GetSites($ID) { global $DB, $CACHE_MANAGER; $ID = intval($ID); $cache_id = "b_forum2site_".$ID; if ($ID <= 0): return false; elseif (!isset($GLOBALS["FORUM_CACHE"]["FORUM"][$ID]) || !is_array($GLOBALS["FORUM_CACHE"]["FORUM"][$ID])): $GLOBALS["FORUM_CACHE"]["FORUM"][$ID] = array(); endif; if (!array_key_exists("SITES", $GLOBALS["FORUM_CACHE"]["FORUM"][$ID])) { if (CACHED_b_forum2site !== false && $CACHE_MANAGER->Read(CACHED_b_forum2site, $cache_id, "b_forum2site")) { $GLOBALS["FORUM_CACHE"]["FORUM"][$ID]["SITES"] = $CACHE_MANAGER->Get($cache_id); } else { $strSql = "SELECT FS.FORUM_ID, FS.SITE_ID, FS.PATH2FORUM_MESSAGE FROM b_forum2site FS WHERE FS.FORUM_ID = ".$ID; $db_res = $DB->Query($strSql); $arRes = array(); while ($res = $db_res->Fetch()) $arRes[$res["SITE_ID"]] = $res["PATH2FORUM_MESSAGE"]; $GLOBALS["FORUM_CACHE"]["FORUM"][$ID]["SITES"] = $arRes; if (CACHED_b_forum2site !== false) $CACHE_MANAGER->Set($cache_id, $GLOBALS["FORUM_CACHE"]["FORUM"][$ID]["SITES"]); } } return $GLOBALS["FORUM_CACHE"]["FORUM"][$ID]["SITES"]; } //---------------> Forum permissions public static function GetPermissionUserDefault($ID) { $arFields = array(2); if (COption::GetOptionString("main", "new_user_registration", "") == "Y") { $def_group = COption::GetOptionString("main", "new_user_registration_def_group", ""); if($def_group != "") { $arFields = explode(",", $def_group); $arFields[] = 2; } } $res = CForumNew::GetUserPermission($ID, $arFields); if ($res >= "E") return "E"; else return "A"; } public static function GetAccessPermissions($ID, $TYPE = "ONE") { $res = []; if (($forum = Forum\Forum::getById($ID)) !== null) { $res = $forum->getPermissions(); } if ($TYPE === "ONE") { $result = []; foreach ($res as $key => $val) { $result[] = [$key, $val]; } return $result; } return $res; } public static function GetAccessPermsList($arOrder = array("ID"=>"ASC"), $arFilter = array()) { global $DB; $arSqlSearch = array(); $strSqlSearch = ""; $arSqlOrder = array(); $strSqlOrder = ""; $arFilter = (is_array($arFilter) ? $arFilter : array()); foreach ($arFilter as $key => $val) { $key_res = CForumNew::GetFilterOperation($key); $key = mb_strtoupper($key_res["FIELD"]); $strNegative = $key_res["NEGATIVE"]; $strOperation = $key_res["OPERATION"]; switch ($key) { case "ID": case "FORUM_ID": case "GROUP_ID": if (intval($val)<=0) $arSqlSearch[] = ($strNegative=="Y"?"NOT":"")."(FP.".$key." IS NULL OR FP.".$key."<=0)"; else $arSqlSearch[] = ($strNegative=="Y"?" FP.".$key." IS NULL OR NOT ":"")."FP.".$key." ".$strOperation." ".intval($val)." "; break; case "PERMISSION": if ($val == '') $arSqlSearch[] = ($strNegative=="Y"?"NOT":"")."(FP.".$key." IS NULL OR ".($DB->type == "MSSQL" ? "LEN" : "LENGTH")."(FP.".$key.")<=0)"; else $arSqlSearch[] = ($strNegative=="Y"?" FP.".$key." IS NULL OR NOT ":"")."FP.".$key." ".$strOperation." '".$DB->ForSql($val)."' "; break; } } if (count($arSqlSearch) > 0) $strSqlSearch = " AND (".implode(" AND ", $arSqlSearch).") "; foreach ($arOrder as $by=>$order) { $by = mb_strtoupper($by); $order = mb_strtoupper($order); if ($order!="ASC") $order = "DESC"; if ($by == "FORUM_ID") $arSqlOrder[] = " FP.FORUM_ID ".$order." "; elseif ($by == "GROUP_ID") $arSqlOrder[] = " FP.GROUP_ID ".$order." "; elseif ($by == "PERMISSION") $arSqlOrder[] = " FP.PERMISSION ".$order." "; else { $arSqlOrder[] = " FP.ID ".$order." "; $by = "ID"; } } DelDuplicateSort($arSqlOrder); if (count($arSqlOrder) > 0) $strSqlOrder = " ORDER BY ".implode(", ", $arSqlOrder); $strSql = "SELECT FP.ID, FP.FORUM_ID, FP.GROUP_ID, FP.PERMISSION FROM b_forum_perms FP WHERE 1 = 1 ".$strSqlSearch." ".$strSqlOrder; $db_res = $DB->Query($strSql); return $db_res; } public static function SetAccessPermissions($ID, $arGROUP_ID) { if (($forum = Forum\Forum::getById($ID)) !== null) { unset($GLOBALS["FORUM_CACHE"]["FORUM"][$ID]["PERMISSION"]); unset($GLOBALS["FORUM_CACHE"]["FORUM"][$ID]["PERMISSIONS"]); if (CACHED_b_forum_perms !== false) { $GLOBALS["CACHE_MANAGER"]->CleanDir("b_forum_perms"); } $forum->setPermission($arGROUP_ID); } return true; } public static function GetUserPermission($ID, $arUserGroups) { $result = Forum\Permission::ACCESS_DENIED; if (($forum = Forum\Forum::getById($ID)) !== null) { if (is_array($arUserGroups)) { $result = $forum->getPermissionForUserGroups($arUserGroups); } else if (($user = Forum\User::getById($arUserGroups)) !== null) { $result = $forum->getPermissionForUser($user); } } return $result; } //---------------> Forum Utils public static function GetFilterOperation($key) { $strNegative = "N"; if (mb_substr($key, 0, 1) == "!") { $key = mb_substr($key, 1); $strNegative = "Y"; } if (mb_substr($key, 0, 2) == ">=") { $key = mb_substr($key, 2); $strOperation = ">="; } elseif (mb_substr($key, 0, 1) == ">") { $key = mb_substr($key, 1); $strOperation = ">"; } elseif (mb_substr($key, 0, 2) == "<=") { $key = mb_substr($key, 2); $strOperation = "<="; } elseif (mb_substr($key, 0, 1) == "<") { $key = mb_substr($key, 1); $strOperation = "<"; } elseif (mb_substr($key, 0, 1) == "@") { $key = mb_substr($key, 1); $strOperation = "IN"; } elseif (mb_substr($key, 0, 1) == "%") { $key = mb_substr($key, 1); $strOperation = "LIKE"; } else { $strOperation = "="; } return array("FIELD"=>$key, "NEGATIVE"=>$strNegative, "OPERATION"=>$strOperation); } public static function prepareField($operation, $type, $vals) { $val = ''; if ($operation == "IN") { if (is_string($vals)) $vals = explode(",", $vals); else if (!is_array($vals)) $vals = array($vals); if ($type == "int") { array_walk( $vals, function (&$item) { $item = (int)$item; } ); $vals = array_unique($vals); $val = implode(",", $vals); } elseif ($type == "double") { array_walk( $vals, function (&$item) { $item = (float)$item; } ); $vals = array_unique($vals); $val = implode(",", $vals); } elseif ($type == "datetime") { array_walk( $vals, function (&$item) { $item = $GLOBALS["DB"]->CharToDateFunction($item, "FULL"); } ); $vals = array_unique($vals); $val = implode(",", $vals); } elseif ($type == "date") { array_walk( $vals, function (&$item) { $item = $GLOBALS["DB"]->CharToDateFunction($item, "SHORT"); } ); $vals = array_unique($vals); $val = implode(",", $vals); } else { array_walk( $vals, function (&$item) { $item = "'".$GLOBALS["DB"]->ForSql($item)."'"; } ); $vals = array_unique($vals); $val = implode(",", $vals); } } else if ($type === "int") { $val = intval($vals); $val = ($val > 0 ? $val : ''); } elseif ($type === "double") { $val = doubleval(str_replace(",", ".", $vals)); $val = ($val > 0 ? $val : ''); } elseif ($type === "datetime") { $val = $GLOBALS["DB"]->CharToDateFunction($vals, "FULL"); } elseif ($type === "date") { $val = $GLOBALS["DB"]->CharToDateFunction($vals, "SHORT"); } else if ($type == "string" || $type == "char") { $val = $GLOBALS["DB"]->ForSql($vals); } return $val; } public static function GetSelectFields($arAddParams = array()) { global $DB; $arAddParams = (is_array($arAddParams) ? $arAddParams : array()); $arAddParams["sPrefix"] = $DB->ForSql(empty($arAddParams["sPrefix"]) ? "F." : $arAddParams["sPrefix"]); $arAddParams["sTablePrefix"] = $DB->ForSql(empty($arAddParams["sTablePrefix"]) ? "F." : $arAddParams["sTablePrefix"]); $arAddParams["sReturnResult"] = ($arAddParams["sReturnResult"] == "string" ? "string" : "array"); $res = array( $arAddParams["sPrefix"]."ID" => $arAddParams["sTablePrefix"]."ID", $arAddParams["sPrefix"]."NAME" => $arAddParams["sTablePrefix"]."NAME", $arAddParams["sPrefix"]."DESCRIPTION" => $arAddParams["sTablePrefix"]."DESCRIPTION", $arAddParams["sPrefix"]."SORT" => $arAddParams["sTablePrefix"]."SORT", $arAddParams["sPrefix"]."ACTIVE" => $arAddParams["sTablePrefix"]."ACTIVE", $arAddParams["sPrefix"]."MODERATION" => $arAddParams["sTablePrefix"]."MODERATION", $arAddParams["sPrefix"]."DEDUPLICATION" => $arAddParams["sTablePrefix"]."DEDUPLICATION", $arAddParams["sPrefix"]."INDEXATION" => $arAddParams["sTablePrefix"]."INDEXATION", $arAddParams["sPrefix"]."ALLOW_MOVE_TOPIC" => $arAddParams["sTablePrefix"]."ALLOW_MOVE_TOPIC", $arAddParams["sPrefix"]."TOPICS" => $arAddParams["sTablePrefix"]."TOPICS", $arAddParams["sPrefix"]."POSTS" => $arAddParams["sTablePrefix"]."POSTS", $arAddParams["sPrefix"]."LAST_POSTER_ID" => $arAddParams["sTablePrefix"]."LAST_POSTER_ID", $arAddParams["sPrefix"]."LAST_POSTER_NAME" => $arAddParams["sTablePrefix"]."LAST_POSTER_NAME", ($arAddParams["sPrefix"] == $arAddParams["sTablePrefix"] ? "" : $arAddParams["sPrefix"]). "LAST_POST_DATE" => $DB->DateToCharFunction($arAddParams["sTablePrefix"]."LAST_POST_DATE", "FULL"), $arAddParams["sPrefix"]."LAST_MESSAGE_ID" => $arAddParams["sTablePrefix"]."LAST_MESSAGE_ID", ($arAddParams["sPrefix"] == $arAddParams["sTablePrefix"] ? "" : $arAddParams["sPrefix"]). "MID" => $arAddParams["sTablePrefix"]."LAST_MESSAGE_ID ", $arAddParams["sPrefix"]."LAST_MESSAGE_ID" => $arAddParams["sTablePrefix"]."LAST_MESSAGE_ID", $arAddParams["sPrefix"]."POSTS_UNAPPROVED" => $arAddParams["sTablePrefix"]."POSTS_UNAPPROVED", $arAddParams["sPrefix"]."ABS_LAST_POSTER_ID" => $arAddParams["sTablePrefix"]."ABS_LAST_POSTER_ID", $arAddParams["sPrefix"]."ABS_LAST_POSTER_NAME" => $arAddParams["sTablePrefix"]."ABS_LAST_POSTER_NAME", ($arAddParams["sPrefix"] == $arAddParams["sTablePrefix"] ? "" : $arAddParams["sPrefix"]). "ABS_LAST_POST_DATE" => $DB->DateToCharFunction($arAddParams["sTablePrefix"]."ABS_LAST_POST_DATE", "FULL"), $arAddParams["sPrefix"]."ABS_LAST_MESSAGE_ID" => $arAddParams["sTablePrefix"]."ABS_LAST_MESSAGE_ID", $arAddParams["sPrefix"]."ORDER_BY" => $arAddParams["sTablePrefix"]."ORDER_BY", $arAddParams["sPrefix"]."ORDER_DIRECTION" => $arAddParams["sTablePrefix"]."ORDER_DIRECTION", $arAddParams["sPrefix"]."ALLOW_HTML" => $arAddParams["sTablePrefix"]."ALLOW_HTML", $arAddParams["sPrefix"]."ALLOW_ANCHOR" => $arAddParams["sTablePrefix"]."ALLOW_ANCHOR", $arAddParams["sPrefix"]."ALLOW_BIU" => $arAddParams["sTablePrefix"]."ALLOW_BIU", $arAddParams["sPrefix"]."ALLOW_IMG" => $arAddParams["sTablePrefix"]."ALLOW_IMG", $arAddParams["sPrefix"]."ALLOW_VIDEO" => $arAddParams["sTablePrefix"]."ALLOW_VIDEO", $arAddParams["sPrefix"]."ALLOW_LIST" => $arAddParams["sTablePrefix"]."ALLOW_LIST", $arAddParams["sPrefix"]."ALLOW_TABLE" => $arAddParams["sTablePrefix"]."ALLOW_TABLE", $arAddParams["sPrefix"]."ALLOW_ALIGN" => $arAddParams["sTablePrefix"]."ALLOW_ALIGN", $arAddParams["sPrefix"]."ALLOW_QUOTE" => $arAddParams["sTablePrefix"]."ALLOW_QUOTE", $arAddParams["sPrefix"]."ALLOW_CODE" => $arAddParams["sTablePrefix"]."ALLOW_CODE", $arAddParams["sPrefix"]."ALLOW_FONT" => $arAddParams["sTablePrefix"]."ALLOW_FONT", $arAddParams["sPrefix"]."ALLOW_SMILES" => $arAddParams["sTablePrefix"]."ALLOW_SMILES", $arAddParams["sPrefix"]."ALLOW_UPLOAD" => $arAddParams["sTablePrefix"]."ALLOW_UPLOAD", $arAddParams["sPrefix"]."ALLOW_TOPIC_TITLED" => $arAddParams["sTablePrefix"]."ALLOW_TOPIC_TITLED", $arAddParams["sPrefix"]."ALLOW_SIGNATURE" => $arAddParams["sTablePrefix"]."ALLOW_SIGNATURE", $arAddParams["sPrefix"]."EVENT1" => $arAddParams["sTablePrefix"]."EVENT1", $arAddParams["sPrefix"]."EVENT2" => $arAddParams["sTablePrefix"]."EVENT2", $arAddParams["sPrefix"]."EVENT3" => $arAddParams["sTablePrefix"]."EVENT3", $arAddParams["sPrefix"]."ALLOW_NL2BR" => $arAddParams["sTablePrefix"]."ALLOW_NL2BR", $arAddParams["sPrefix"]."ALLOW_UPLOAD_EXT" => $arAddParams["sTablePrefix"]."ALLOW_UPLOAD_EXT", $arAddParams["sPrefix"]."FORUM_GROUP_ID" => $arAddParams["sTablePrefix"]."FORUM_GROUP_ID", $arAddParams["sPrefix"]."ASK_GUEST_EMAIL" => $arAddParams["sTablePrefix"]."ASK_GUEST_EMAIL", $arAddParams["sPrefix"]."USE_CAPTCHA" => $arAddParams["sTablePrefix"]."USE_CAPTCHA", $arAddParams["sPrefix"]."HTML" => $arAddParams["sTablePrefix"]."HTML"); if ($arAddParams["sReturnResult"] == "string") { $arRes = array(); foreach ($res as $key => $val) { $arRes[] = $val.($key != $val ? " AS ".$key : ""); } $res = implode(", ", $arRes); } return $res; } //---------------> Forum list public static function GetList($arOrder = Array("SORT"=>"ASC"), $arFilter = Array(), $arAddParams = array()) { global $DB; $arSqlSearch = Array(); $arSqlSearchFrom = Array(); $strSqlSelect = ""; $strSqlSearchFrom = ""; $strSqlSearch = ""; $arSqlOrder = Array(); $strSqlOrder = ""; $arFilter = (is_array($arFilter) ? $arFilter : array()); foreach ($arFilter as $key => $val) { $key_res = CForumNew::GetFilterOperation($key); $key = mb_strtoupper($key_res["FIELD"]); $strNegative = $key_res["NEGATIVE"]; $strOperation = $key_res["OPERATION"]; switch ($key) { case "LID": case "SITE_ID": $val = trim($val); if ($val <> '') { $arSqlSearch[] = "F.ID = F2S.FORUM_ID AND ".($strNegative=="Y"?" NOT ":"")."(F2S.SITE_ID ".$strOperation." '".$DB->ForSql($val)."' )"; $arSqlSearchFrom[] = "b_forum2site F2S"; } break; case "INDEXATION": case "DEDUPLICATION": case "ACTIVE": case "XML_ID": if ($val == '') $arSqlSearch[] = ($strNegative=="Y"?"NOT":"")."(F.".$key." IS NULL OR ".($DB->type == "MSSQL" ? "LEN" : "LENGTH")."(F.".$key.")<=0)"; else $arSqlSearch[] = ($strNegative=="Y"?" F.".$key." IS NULL OR NOT ":"")."(F.".$key." ".$strOperation." '".$DB->ForSql($val)."' )"; break; case "ID": case "FORUM_GROUP_ID": case "TOPICS": case "POSTS": case "POSTS_UNAPPROVED": if ($strOperation == "IN") { if (is_array($val)) { $val_int = array(); foreach ($val as $v) $val_int[] = intval($v); $val = implode(", ", $val_int); } else { $val = intval($val); } $val = trim($val); } if (($strOperation == "IN" && $val == '') || intval($val) <= 0) $arSqlSearch[] = ($strNegative=="Y"?"NOT":"")."(F.".$key." IS NULL OR F.".$key."<=0)"; elseif ($strOperation == "IN") $arSqlSearch[] = ($strNegative=="Y"?" NOT ":"")."(F.".$key." IN (".$DB->ForSql($val)."))"; else $arSqlSearch[] = ($strNegative=="Y"?" F.".$key." IS NULL OR NOT ":"")."(F.".$key." ".$strOperation." ".intval($val)." )"; break; case "TEXT": $arSqlSearch[] = " (".GetFilterQuery("F.NAME,F.DESCRIPTION", $DB->ForSql($val), "Y").") "; break; case "PERMS": if (is_array($val) && count($val)>1) { $val[1] = mb_strtoupper(mb_substr($val[1], 0, 1)); if (mb_strpos("AEIMQUY", $val[1]) !== false) { $arSqlSearch[] = "F.ID = FP.FORUM_ID AND FP.GROUP_ID IN (".intval($val[0]).") AND FP.PERMISSION > '".$DB->ForSql($val[1])."' "; $arSqlSearchFrom[] = "b_forum_perms FP"; } } break; } } if (count($arSqlSearch) > 0) $strSqlSearch = " AND (".implode(") AND (", $arSqlSearch).") "; if (count($arSqlSearchFrom) > 0) $strSqlSearchFrom = ", ".implode(", ", $arSqlSearchFrom); foreach ($arOrder as $by=>$order) { $by = mb_strtoupper($by); $order = mb_strtoupper($order); if ($order!="ASC") $order = "DESC"; if ($by == "ID") $arSqlOrder[] = " F.ID ".$order." "; elseif ($by == "NAME") $arSqlOrder[] = " F.NAME ".$order." "; elseif ($by == "ACTIVE") $arSqlOrder[] = " F.ACTIVE ".$order." "; elseif ($by == "MODERATION") $arSqlOrder[] = " F.MODERATION ".$order." "; elseif ($by == "FORUM_GROUP_ID") $arSqlOrder[] = " F.FORUM_GROUP_ID ".$order." "; elseif ($by == "TOPICS") $arSqlOrder[] = " F.TOPICS ".$order." "; elseif ($by == "POSTS") $arSqlOrder[] = " F.POSTS ".$order." "; elseif ($by == "POSTS_UNAPPROVED") $arSqlOrder[] = " F.POSTS_UNAPPROVED ".$order." "; elseif ($by == "LAST_POST_DATE") $arSqlOrder[] = " F.LAST_POST_DATE ".$order." "; else { $arSqlOrder[] = " F.SORT ".$order." "; $by = "SORT"; } } DelDuplicateSort($arSqlOrder); if (count($arSqlOrder) > 0) $strSqlOrder = " ORDER BY ".implode(", ", $arSqlOrder); $strSql = "SELECT F_FORUM.*, F.NAME, F.DESCRIPTION, F.ACTIVE, F.MODERATION, F.INDEXATION, F.DEDUPLICATION, F.ALLOW_MOVE_TOPIC, '' as LID, F.TOPICS, F.POSTS, F.LAST_POSTER_ID, F.LAST_POSTER_NAME, ".$DB->DateToCharFunction("F.LAST_POST_DATE", "FULL")." as LAST_POST_DATE, F.LAST_MESSAGE_ID, F.LAST_MESSAGE_ID as MID, F.POSTS_UNAPPROVED, F.ABS_LAST_POSTER_ID, F.ABS_LAST_POSTER_NAME, ".$DB->DateToCharFunction("F.ABS_LAST_POST_DATE", "FULL")." as ABS_LAST_POST_DATE, F.ABS_LAST_MESSAGE_ID, F.SORT, F.ORDER_BY, F.ORDER_DIRECTION, F.ALLOW_HTML, F.ALLOW_ANCHOR, F.ALLOW_BIU, F.ALLOW_IMG, F.ALLOW_VIDEO, F.ALLOW_TABLE, F.ALLOW_LIST, F.ALLOW_QUOTE, F.ALLOW_CODE, F.ALLOW_ALIGN, F.ALLOW_FONT, F.ALLOW_SMILES, F.ALLOW_UPLOAD, F.EVENT1, F.EVENT2, F.EVENT3, F.ALLOW_NL2BR, '' as PATH2FORUM_MESSAGE, F.ALLOW_UPLOAD_EXT, F.ALLOW_TOPIC_TITLED, F.ALLOW_SIGNATURE, F.FORUM_GROUP_ID, F.ASK_GUEST_EMAIL, F.USE_CAPTCHA, F.XML_ID FROM ( SELECT F.ID ".$strSqlSelect." FROM b_forum F ".$strSqlSearchFrom." WHERE (1=1 ".$strSqlSearch.") GROUP BY F.ID ) F_FORUM INNER JOIN b_forum F ON (F_FORUM.ID = F.ID) ".$strSqlOrder; $db_res = $DB->Query($strSql); return $db_res; } public static function GetListEx($arOrder = Array("SORT"=>"ASC"), $arFilter = Array(), $bCount = false, $iNum = 0, $arAddParams = array()) { global $DB; $arSqlSearch = array(); $orSqlSearch = array(); $arSqlSelect = array(); $arSqlFrom = array(); $arSqlGroup = array(); $arSqlOrder = array(); $strSqlSearch = ""; $strSqlSelect = ""; $strSqlSearchOR = ""; $strSqlFrom = ""; $strSqlGroup = ""; $strSqlOrder = ""; $arFilter = (is_array($arFilter) ? $arFilter : array()); foreach ($arFilter as $key => $val) { $key_res = CForumNew::GetFilterOperation($key); $key = mb_strtoupper($key_res["FIELD"]); $strNegative = $key_res["NEGATIVE"]; $strOperation = $key_res["OPERATION"]; switch ($key) { case "LID": case "SITE_ID": if ($val == ''): break; endif; $arSqlSelect["PATH2FORUM_MESSAGE"] = "F2S.PATH2FORUM_MESSAGE"; $arSqlGroup["PATH2FORUM_MESSAGE"] = "F2S.PATH2FORUM_MESSAGE"; $arSqlFrom["F2S"] = " INNER JOIN b_forum2site F2S ON (F2S.FORUM_ID=F.ID)"; $arSqlSearch[] = ($strNegative=="Y"?" NOT ":"")."(F2S.SITE_ID ".$strOperation." '".$DB->ForSql($val)."')"; break; case "INDEXATION": case "DEDUPLICATION": case "ACTIVE": case "XML_ID": case "ALLOW_MOVE_TOPIC": case "ALLOW_SIGNATURE": if ($val == '') $arSqlSearch[] = ($strNegative=="Y"?"NOT":"")."(F.".$key." IS NULL OR ".($DB->type == "MSSQL" ? "LEN" : "LENGTH")."(F.".$key.") <= 0)"; else $arSqlSearch[] = ($strNegative=="Y"?" F.".$key." IS NULL OR NOT ":"")."(F.".$key." ".$strOperation." '".$DB->ForSql($val)."')"; break; case "ID": case "FORUM_GROUP_ID": case "TOPICS": case "POSTS": $val = array_map("intval", (is_array($val) ? $val : explode(",", $val))); if (array_sum($val) <= 0) $arSqlSearch[] = ($strNegative == "Y" ? "NOT" : "") . "(F.".$key." IS NULL OR F.".$key."<=0)"; elseif ($strOperation == "IN" || count($val) > 1) $arSqlSearch[] = ($strNegative=="Y"?" NOT ":"")."(F.".$key." IN (".$DB->ForSql(implode(",", $val))."))"; else $arSqlSearch[] = ($strNegative=="Y"?" F.".$key." IS NULL OR NOT ":"")."(F.".$key." ".$strOperation." ".reset($val)." )"; break; case "TEXT": $arSqlSearch[] = " (".GetFilterQuery("F.NAME,F.DESCRIPTION", $DB->ForSql($val), "Y").") "; break; case "PERMS": $v = (is_array($val) && isset($val[0]) && !empty($val[0]) ? array_map("intval", is_array($val[0]) ? $val[0] : explode(",", $val[0])) : array()); if (empty($v)) break; $val[0] = $DB->ForSql(implode(", ", $v)); $arSqlFrom["FP"] = " INNER JOIN b_forum_perms FP ON (F.ID = FP.FORUM_ID)"; if (mb_strtoupper($val[1]) == "ALLOW_MOVE_TOPIC") $arSqlSearch[] = "FP.GROUP_ID IN (".$val[0].") AND ((FP.PERMISSION > 'M') OR (F.ALLOW_MOVE_TOPIC = 'Y'))"; else $arSqlSearch[] = "FP.GROUP_ID IN (".$val[0].") AND FP.PERMISSION > '".$DB->ForSql($val[1])."' "; break; case "APPROVED": if ($val == ''): break; endif; $arSqlFrom["FMM"] = " LEFT JOIN b_forum_message FMM ON (FMM.FORUM_ID=F.ID AND (FMM.APPROVED ".$strOperation." '".$DB->ForSql($val)."'))"; $arSqlSelect["FMM"] = "count(FMM.ID) MCNT"; break; case "RENEW": $val = intval($val); if ($val <= 0): break; endif; $perms = "NOT_CHECK"; $arUserGroups = $GLOBALS["USER"]->GetGroups(); if (is_set($arFilter, "PERMS")): $perms = "NORMAL"; $arUserGroups = $arFilter["PERMS"][0]; elseif (is_set($arFilter, "APPROVED") && $arFilter["APPROVED"] == "Y"): $perms = "ONLY_APPROVED"; endif; $arSqlSelect["TCRENEW"] = "MAX(BFF.TCRENEW) AS TCRENEW"; $arSqlFrom["RENEW"] = " LEFT JOIN ( SELECT BF.ID AS RENEW_FORUM_ID, COUNT(FT_RENEW.ID) TCRENEW FROM b_forum BF ". ($perms == "NORMAL" ? " LEFT JOIN ( SELECT FPP.FORUM_ID, MAX(FPP.PERMISSION) AS PERMISSION FROM b_forum_perms FPP WHERE FPP.GROUP_ID IN (".$arUserGroups.") GROUP BY FPP.FORUM_ID ) FP ON (FP.FORUM_ID = BF.ID)" : "" ). " LEFT JOIN b_forum_user_forum FUF ON (FUF.USER_ID=".$val." AND FUF.FORUM_ID = BF.ID) LEFT JOIN b_forum_user_forum FUF_ALL ON (FUF_ALL.USER_ID=".$val." AND FUF_ALL.FORUM_ID = 0) LEFT JOIN b_forum_topic FT_RENEW ON (BF.ID = FT_RENEW.FORUM_ID AND FT_RENEW.STATE != 'L' AND (FUF_ALL.LAST_VISIT IS NULL OR FT_RENEW.ABS_LAST_POST_DATE > FUF_ALL.LAST_VISIT)) LEFT JOIN b_forum_user_topic FUT_RENEW ON (FUT_RENEW.FORUM_ID = BF.ID AND FUT_RENEW.TOPIC_ID = FT_RENEW.ID AND FUT_RENEW.USER_ID=".$val.") WHERE ( FUT_RENEW.LAST_VISIT IS NULL AND ( (FUF_ALL.LAST_VISIT IS NULL AND FUF.LAST_VISIT IS NULL) OR ( FUF.LAST_VISIT IS NOT NULL AND ". ( $perms == "NORMAL" ? " (FP.PERMISSION >= 'Q' AND FUF.LAST_VISIT < FT_RENEW.ABS_LAST_POST_DATE) OR (FT_RENEW.APPROVED = 'Y' AND FUF.LAST_VISIT < FT_RENEW.LAST_POST_DATE) " : ( $perms == "NOT_CHECK" ? " (FUF.LAST_VISIT < FT_RENEW.ABS_LAST_POST_DATE OR FUF.LAST_VISIT < FT_RENEW.LAST_POST_DATE) " : " (FT_RENEW.APPROVED = 'Y' AND FUF.LAST_VISIT < FT_RENEW.LAST_POST_DATE) " ) ) ." ) OR ( FUF.LAST_VISIT IS NULL AND FUF_ALL.LAST_VISIT IS NOT NULL AND ( ". ( $perms == "NORMAL" ? " (FP.PERMISSION >= 'Q' AND FUF_ALL.LAST_VISIT < FT_RENEW.ABS_LAST_POST_DATE) OR (FT_RENEW.APPROVED = 'Y' AND FUF_ALL.LAST_VISIT < FT_RENEW.LAST_POST_DATE) " : ( $perms == "NOT_CHECK" ? " (FUF_ALL.LAST_VISIT < FT_RENEW.ABS_LAST_POST_DATE OR FUF_ALL.LAST_VISIT < FT_RENEW.LAST_POST_DATE) " : " (FT_RENEW.APPROVED = 'Y' AND FUF_ALL.LAST_VISIT < FT_RENEW.LAST_POST_DATE) " ) ) ." ) ) ) ) OR ( FUT_RENEW.LAST_VISIT IS NOT NULL AND ". ( $perms == "NORMAL" ? " (FP.PERMISSION >= 'Q' AND FUT_RENEW.LAST_VISIT < FT_RENEW.ABS_LAST_POST_DATE) OR (FT_RENEW.APPROVED = 'Y' AND FUT_RENEW.LAST_VISIT < FT_RENEW.LAST_POST_DATE) " : ( $perms == "NOT_CHECK" ? " (FUT_RENEW.LAST_VISIT < FT_RENEW.ABS_LAST_POST_DATE OR FUT_RENEW.LAST_VISIT < FT_RENEW.LAST_POST_DATE) " : " (FT_RENEW.APPROVED = 'Y' AND FUT_RENEW.LAST_VISIT < FT_RENEW.LAST_POST_DATE) " ) ) ." ) GROUP BY BF.ID". ( $perms == "NORMAL" ? ", FP.PERMISSION" : "")." ) BFF ON (BFF.RENEW_FORUM_ID = F.ID) "; break; } } if (count($arSqlSearch) > 0) $strSqlSearch = " AND (".implode(") AND (", $arSqlSearch).") "; if (count($orSqlSearch) > 0) $strSqlSearchOR = " OR (".implode(") AND (", $orSqlSearch).") "; if (count($arSqlSelect) > 0) $strSqlSelect = ", ".implode(", ", $arSqlSelect); if (count($arSqlFrom) > 0) $strSqlFrom = " ".implode(" ", $arSqlFrom); if (count($arSqlGroup) > 0) $strSqlGroup = ",".implode(",", $arSqlGroup); foreach ($arOrder as $by=>$order) { $by = mb_strtoupper($by); $order = mb_strtoupper($order); if ($order!="ASC") $order = "DESC".($DB->type=="ORACLE"?" NULLS LAST":""); else $order = "ASC".($DB->type=="ORACLE"?" NULLS FIRST":""); if ($by == "ID") $arSqlOrder["F_FORUM.ID"] = " F_FORUM.ID ".$order." "; elseif ($by == "NAME") $arSqlOrder["F.NAME"] = " F.NAME ".$order." "; elseif ($by == "ACTIVE") $arSqlOrder["F.ACTIVE"] = " F.ACTIVE ".$order." "; elseif ($by == "MODERATION") $arSqlOrder["F.MODERATION"] = " F.MODERATION ".$order." "; elseif ($by == "FORUM_GROUP_ID") $arSqlOrder["F.FORUM_GROUP_ID"] = " F.FORUM_GROUP_ID ".$order." "; elseif ($by == "FORUM_GROUP_SORT") $arSqlOrder["FG.SORT"] = " FG.SORT ".$order." "; elseif ($by == "FORUM_GROUP_LEFT_MARGIN") $arSqlOrder["FG.LEFT_MARGIN"] = " FG.LEFT_MARGIN ".$order." "; elseif ($by == "TOPICS") $arSqlOrder["F.TOPICS"] = " F.TOPICS ".$order." "; elseif ($by == "POSTS") $arSqlOrder["F.POSTS"] = " F.POSTS ".$order." "; elseif ($by == "POSTS_UNAPPROVED") $arSqlOrder["F.POSTS_UNAPPROVED"] = " F.POSTS_UNAPPROVED ".$order." "; elseif ($by == "LAST_POST_DATE") $arSqlOrder["F.LAST_POST_DATE"] = " F.LAST_POST_DATE ".$order." "; elseif ($by == "ABS_LAST_POST_DATE") $arSqlOrder["F.ABS_LAST_POST_DATE"] = " F.ABS_LAST_POST_DATE ".$order." "; else { $arSqlOrder["F.SORT"] = " F.SORT ".$order." "; $by = "SORT"; } } if (count($arSqlOrder) > 0) $strSqlOrder = " ORDER BY ".implode(", ", $arSqlOrder); if ($bCount || (isset($arAddParams['bDescPageNumbering']) && empty($arAddParams['nTopCount']))) { $arCountSqlFrom = $arSqlFrom; if (isset($arSqlFrom['RENEW']) && (mb_strpos($strSqlSearch, "RENEW.") === false)) unset($arCountSqlFrom['RENEW']); $strSqlCountFrom = implode(" ", $arCountSqlFrom); $strSql = "SELECT COUNT(FORUMCOUNT.ID) as CNT FROM (". "SELECT F.ID ". " FROM b_forum F ". $strSqlCountFrom ." ". " WHERE (1=1 ".$strSqlSearch.") ". $strSqlSearchOR. " GROUP BY F.ID". ") FORUMCOUNT"; $db_res = $DB->Query($strSql); $iCnt = 0; if ($ar_res = $db_res->Fetch()) { $iCnt = intval($ar_res["CNT"]); } if ($bCount) return $iCnt; } if (!$iNum && isset($arAddParams['bDescPageNumbering']) && empty($arAddParams["nTopCount"]) && isset($arAddParams['nav_result'])) { if (!$arAddParams['nav_result']) { $strSubSql = "SELECT F_FORUM.* ". "FROM ". "(SELECT F.ID, FG.SORT ".$strSqlSelect. " ". "FROM b_forum F ". $strSqlFrom." ". "LEFT JOIN b_forum_group FG ON F.FORUM_GROUP_ID = FG.ID ". "WHERE (1=1 ".$strSqlSearch.") ". $strSqlSearchOR." ". "GROUP BY F.ID, FG.SORT".$strSqlGroup. ") F_FORUM ". "INNER JOIN b_forum F ON (F_FORUM.ID = F.ID) ". str_replace("FG.SORT", "F_FORUM.SORT", $strSqlOrder); $db_res = new CDBResult(); $db_res->NavQuery($strSubSql, $iCnt, $arAddParams); return $db_res; } else { $db_res = $arAddParams['nav_result']; } $arForumID = array(); while($ar_res = $db_res->Fetch()) { $arForumID[] = $ar_res['ID']; } $sForumID = implode(', ', $arForumID); $strSqlSearch = "(".($sForumID != "" ? "F.ID IN (".$sForumID.") " : "1=1 ").$strSqlSearch.")"; } else { $strSqlSearch = "(1=1 ".$strSqlSearch.")"; } $arSQL = array("select" => "", "join" => ""); if (!empty($arAddParams["sNameTemplate"])) { $arSQL = array_merge_recursive( CForumUser::GetFormattedNameFieldsForSelect(array_merge( $arAddParams, array( "sUserTablePrefix" => "U_LAST.", "sForumUserTablePrefix" => "FU_LAST.", "sFieldName" => "LAST_POSTER_NAME_FRMT", "sUserIDFieldName" => "F.LAST_POSTER_ID"))), CForumUser::GetFormattedNameFieldsForSelect(array_merge( $arAddParams, array( "sUserTablePrefix" => "U_ABS_LAST.", "sForumUserTablePrefix" => "FU_ABS_LAST.", "sFieldName" => "ABS_LAST_POSTER_NAME_FRMT", "sUserIDFieldName" => "F.ABS_LAST_POSTER_ID")))); $arSQL["select"] = ",\n\t".implode(",\n\t", $arSQL["select"]); $arSQL["join"] = "\n".implode("\n", $arSQL["join"]); } $strSql = "SELECT F_FORUM.*, F.FORUM_GROUP_ID, F.NAME, F.DESCRIPTION, F.SORT, F.ACTIVE, F.ALLOW_HTML, F.ALLOW_ANCHOR, F.ALLOW_BIU, F.ALLOW_IMG, F.ALLOW_VIDEO, F.ALLOW_LIST, F.ALLOW_QUOTE, F.ALLOW_CODE, F.ALLOW_FONT, F.ALLOW_SMILES, F.ALLOW_ALIGN, F.ALLOW_UPLOAD, F.ALLOW_UPLOAD_EXT, F.ALLOW_MOVE_TOPIC, F.ALLOW_NL2BR, F.ALLOW_TABLE, F.ALLOW_TOPIC_TITLED, F.ALLOW_SIGNATURE, ".(mb_strpos($strSqlSelect, "PATH2FORUM_MESSAGE") === false ? "'' as PATH2FORUM_MESSAGE," : "")." F.ASK_GUEST_EMAIL, F.USE_CAPTCHA, F.MODERATION, F.INDEXATION, F.DEDUPLICATION, F.ORDER_BY, F.ORDER_DIRECTION, '' as LID, '' as DIR, F.TOPICS, F.XML_ID, F.POSTS, F.LAST_POSTER_ID, F.LAST_POSTER_NAME, ".$DB->DateToCharFunction("F.LAST_POST_DATE", "FULL")." as LAST_POST_DATE, F.LAST_MESSAGE_ID, FM.TOPIC_ID as TID, F.LAST_MESSAGE_ID as MID, F.POSTS_UNAPPROVED, F.ABS_LAST_POSTER_ID, F.ABS_LAST_POSTER_NAME, ".$DB->DateToCharFunction("F.ABS_LAST_POST_DATE", "FULL")." as ABS_LAST_POST_DATE, F.ABS_LAST_MESSAGE_ID, FM_ABS.TOPIC_ID as ABS_TID, F.EVENT1, F.EVENT2, F.EVENT3, FT.TITLE, FT.SOCNET_GROUP_ID, FT.OWNER_ID, ".CForumNew::Concat("-", array("FT.ID", "FT.TITLE_SEO"))." AS TITLE_SEO, FT.HTML AS TOPIC_HTML, FM.PARAM1, FM.PARAM2, FT_ABS.TITLE as ABS_TITLE, FT_ABS.SOCNET_GROUP_ID as ABS_SOCNET_GROUP_ID, FT_ABS.OWNER_ID as ABS_OWNER_ID, ".CForumNew::Concat("-", array("FT_ABS.ID", "FT_ABS.TITLE_SEO"))." AS ABS_TITLE_SEO, FT_ABS.HTML AS ABS_TOPIC_HTML, FM_ABS.PARAM1 as ABS_PARAM1, FM_ABS.PARAM2 as ABS_PARAM2, F.HTML".$arSQL["select"]." FROM ( SELECT F.ID ".$strSqlSelect." FROM b_forum F ".$strSqlFrom." WHERE ".$strSqlSearch." ".$strSqlSearchOR." GROUP BY F.ID".$strSqlGroup." ) F_FORUM INNER JOIN b_forum F ON (F_FORUM.ID = F.ID)". $arSQL["join"]." LEFT JOIN b_forum_group FG ON F.FORUM_GROUP_ID = FG.ID LEFT JOIN b_forum_message FM ON F.LAST_MESSAGE_ID = FM.ID LEFT JOIN b_forum_topic FT ON FM.TOPIC_ID = FT.ID LEFT JOIN b_forum_message FM_ABS ON F.ABS_LAST_MESSAGE_ID = FM_ABS.ID LEFT JOIN b_forum_topic FT_ABS ON FM_ABS.TOPIC_ID = FT_ABS.ID ".$strSqlOrder; $iNum = intval($iNum ?: ($arAddParams["nTopCount"] ?? 0)); if ($iNum > 0) { $strSql .= " LIMIT 0,".$iNum; } $db_res = $DB->Query($strSql); if (is_set($arAddParams, 'NoFilter') && $arAddParams['NoFilter'] == true) return $db_res; return new _CForumDBResult($db_res, $arAddParams); } public static function GetForumRenew($data) { global $DB, $USER; $userId = false; if (array_key_exists("USER_ID", $data) && $data["USER_ID"] > 0) { $userId = intval($data["USER_ID"]); } else if ($USER->IsAuthorized()) { $userId = $USER->GetID(); } $forums = array_key_exists("FORUM_ID", $data) ? $data["FORUM_ID"] : []; $forums = is_array($forums) ? $forums : [$forums]; array_map("intval", $forums); if ($userId === false || sizeof($forums) <= 0) { return false; } $sWhere = "(1=1)"; if (sizeof($forums) > 0) { $sWhere = '(BF.ID IN ('.implode(", ", $forums).'))'; } $strSql = <<<SQL SELECT BF.ID AS FORUM_ID, COUNT(FT_RENEW.ID) AS TCRENEW FROM b_forum BF LEFT JOIN b_forum_user_forum FUF ON (FUF.USER_ID = {$userId} AND FUF.FORUM_ID = BF.ID) LEFT JOIN b_forum_user_forum FUF_ALL ON (FUF_ALL.USER_ID = {$userId} AND FUF_ALL.FORUM_ID = 0) LEFT JOIN b_forum_topic FT_RENEW ON ( BF.ID = FT_RENEW.FORUM_ID AND FT_RENEW.STATE != 'L' AND (FUF_ALL.LAST_VISIT IS NULL OR FT_RENEW.ABS_LAST_POST_DATE > FUF_ALL.LAST_VISIT) ) LEFT JOIN b_forum_user_topic FUT_RENEW ON ( FUT_RENEW.FORUM_ID = BF.ID AND FUT_RENEW.TOPIC_ID = FT_RENEW.ID AND FUT_RENEW.USER_ID = {$userId}) WHERE( {$sWhere} AND ( FUT_RENEW.LAST_VISIT IS NULL AND ( (FUF_ALL.LAST_VISIT IS NULL AND FUF.LAST_VISIT IS NULL) OR ( FUF.LAST_VISIT IS NOT NULL AND (FUF.LAST_VISIT < FT_RENEW.ABS_LAST_POST_DATE OR FUF.LAST_VISIT < FT_RENEW.LAST_POST_DATE) ) OR ( FUF.LAST_VISIT IS NULL AND FUF_ALL.LAST_VISIT IS NOT NULL AND ( ( FUF_ALL.LAST_VISIT < FT_RENEW.ABS_LAST_POST_DATE OR FUF_ALL.LAST_VISIT < FT_RENEW.LAST_POST_DATE ) ) ) ) ) OR ( FUT_RENEW.LAST_VISIT IS NOT NULL AND ( FUT_RENEW.LAST_VISIT < FT_RENEW.ABS_LAST_POST_DATE OR FUT_RENEW.LAST_VISIT < FT_RENEW.LAST_POST_DATE ) ) ) GROUP BY BF.ID SQL; $db_res = $DB->Query($strSql); return $db_res; } public static function GetByID($ID) { global $DB, $CACHE_MANAGER; $ID = intval($ID); $cache_id = "b_forum_".$ID; if ($ID <= 0): return false; elseif (!isset($GLOBALS["FORUM_CACHE"]["FORUM"][$ID]) || !is_array($GLOBALS["FORUM_CACHE"]["FORUM"][$ID])): $GLOBALS["FORUM_CACHE"]["FORUM"][$ID] = array(); endif; if (!array_key_exists("MAIN", $GLOBALS["FORUM_CACHE"]["FORUM"][$ID])) { if (CACHED_b_forum !== false && $CACHE_MANAGER->Read(CACHED_b_forum, $cache_id, "b_forum")) { $GLOBALS["FORUM_CACHE"]["FORUM"][$ID]["MAIN"] = $CACHE_MANAGER->Get($cache_id); } else { $strSql = "SELECT F.ID, F.NAME, F.DESCRIPTION, F.ACTIVE, F.MODERATION, F.INDEXATION, F.ALLOW_MOVE_TOPIC, F.DEDUPLICATION, '' as LID, F.TOPICS, F.POSTS, F.LAST_POSTER_ID, F.LAST_POSTER_NAME, ".$DB->DateToCharFunction("F.LAST_POST_DATE", "FULL")." as LAST_POST_DATE, F.LAST_MESSAGE_ID, F.LAST_MESSAGE_ID as MID, F.POSTS_UNAPPROVED, F.ABS_LAST_POSTER_ID, F.ABS_LAST_POSTER_NAME, ".$DB->DateToCharFunction("F.ABS_LAST_POST_DATE", "FULL")." as ABS_LAST_POST_DATE, F.ABS_LAST_MESSAGE_ID, F.SORT, F.ORDER_BY, F.ORDER_DIRECTION, F.ALLOW_HTML, F.ALLOW_ANCHOR, F.ALLOW_BIU, F.ALLOW_TOPIC_TITLED, F.ALLOW_IMG, F.ALLOW_VIDEO, F.ALLOW_LIST, F.ALLOW_QUOTE, F.ALLOW_CODE, F.ALLOW_TABLE, F.ALLOW_ALIGN, F.ALLOW_FONT, F.ALLOW_SMILES, F.ALLOW_UPLOAD, F.EVENT1, F.EVENT2, F.EVENT3, F.ALLOW_NL2BR, '' as PATH2FORUM_MESSAGE, F.ALLOW_UPLOAD_EXT, F.ALLOW_SIGNATURE, F.FORUM_GROUP_ID, F.ASK_GUEST_EMAIL, F.USE_CAPTCHA, F.XML_ID FROM b_forum F WHERE F.ID = ".$ID; $db_res = $DB->Query($strSql); $GLOBALS["FORUM_CACHE"]["FORUM"][$ID]["MAIN"] = $db_res->GetNext(); if (CACHED_b_forum !== false) $CACHE_MANAGER->Set($cache_id, $GLOBALS["FORUM_CACHE"]["FORUM"][$ID]["MAIN"]); } } return $GLOBALS["FORUM_CACHE"]["FORUM"][$ID]["MAIN"]; } public static function GetByIDEx($ID, $SITE_ID = false, $arAddParams = array()) { global $DB, $CACHE_MANAGER; $ID = intval($ID); if ($ID <= 0) { return false; } $SITE_ID = $SITE_ID ?? false; $key = (empty($SITE_ID) ? "EX" : "EX_PATH_".mb_strtoupper($SITE_ID)); if (!isset($GLOBALS["FORUM_CACHE"]["FORUM"][$ID])) { $GLOBALS["FORUM_CACHE"]["FORUM"][$ID] = array(); } if (!array_key_exists($key, $GLOBALS["FORUM_CACHE"]["FORUM"][$ID])) { $cache_id = "b_forum_".$ID.mb_strtolower($key); if (CACHED_b_forum !== false && $CACHE_MANAGER->Read(CACHED_b_forum, $cache_id, "b_forum")) { $GLOBALS["FORUM_CACHE"]["FORUM"][$ID][$key] = $CACHE_MANAGER->Get($cache_id); } else { $arSQL = array("select" => "", "join" => ""); if (!empty($arAddParams["sNameTemplate"])) { $arSQL = array_merge_recursive( CForumUser::GetFormattedNameFieldsForSelect(array_merge( $arAddParams, array( "sUserTablePrefix" => "U_LAST.", "sForumUserTablePrefix" => "FU_LAST.", "sFieldName" => "LAST_POSTER_NAME_FRMT", "sUserIDFieldName" => "F.LAST_POSTER_ID"))), CForumUser::GetFormattedNameFieldsForSelect(array_merge( $arAddParams, array( "sUserTablePrefix" => "U_ABS_LAST.", "sForumUserTablePrefix" => "FU_ABS_LAST.", "sFieldName" => "ABS_LAST_POSTER_NAME_FRMT", "sUserIDFieldName" => "F.ABS_LAST_POSTER_ID")))); $arSQL["select"] = ",\n\t".implode(",\n\t", $arSQL["select"]); $arSQL["join"] = "\n".implode("\n", $arSQL["join"]); } $strSql = "SELECT F.ID, F.NAME, F.DESCRIPTION, F.ACTIVE, F.MODERATION, F.INDEXATION, F.DEDUPLICATION, F.ALLOW_MOVE_TOPIC, '' as LID, F.TOPICS, F.POSTS, F.LAST_POSTER_ID, F.LAST_POSTER_NAME, ".$DB->DateToCharFunction("F.LAST_POST_DATE", "FULL")." as LAST_POST_DATE, F.LAST_MESSAGE_ID, FM.TOPIC_ID as TID, F.LAST_MESSAGE_ID as MID, F.POSTS_UNAPPROVED, F.ABS_LAST_POSTER_ID, F.ABS_LAST_POSTER_NAME, ".$DB->DateToCharFunction("F.ABS_LAST_POST_DATE", "FULL")." as ABS_LAST_POST_DATE, F.ABS_LAST_MESSAGE_ID, FT.TITLE, F.SORT, '' as DIR, F.ORDER_BY, F.ORDER_DIRECTION, F.ALLOW_HTML, F.ALLOW_ANCHOR, F.ALLOW_BIU, F.ALLOW_TABLE, F.ALLOW_ALIGN, F.ALLOW_SIGNATURE, F.ALLOW_IMG, F.ALLOW_VIDEO, F.ALLOW_LIST, F.ALLOW_QUOTE, F.ALLOW_CODE, F.ALLOW_TOPIC_TITLED, F.ALLOW_FONT, F.ALLOW_SMILES, F.ALLOW_UPLOAD, F.EVENT1, F.EVENT2, F.EVENT3, F.ALLOW_NL2BR, ".(!$SITE_ID ? "''" : "FS.PATH2FORUM_MESSAGE")." as PATH2FORUM_MESSAGE, F.ALLOW_UPLOAD_EXT, F.FORUM_GROUP_ID, F.ASK_GUEST_EMAIL, F.USE_CAPTCHA, F.HTML, FT.HTML AS TOPIC_HTML, F.XML_ID".$arSQL["select"]." FROM b_forum F LEFT JOIN b_forum_group FG ON (F.FORUM_GROUP_ID = FG.ID) ". (!$SITE_ID ? "" : " LEFT JOIN b_forum2site FS ON (F.ID = FS.FORUM_ID AND FS.SITE_ID = '".$DB->ForSql($SITE_ID)."') "). $arSQL["join"]." LEFT JOIN b_forum_message FM ON (F.LAST_MESSAGE_ID = FM.ID) LEFT JOIN b_forum_topic FT ON (FM.TOPIC_ID = FT.ID) WHERE (F.ID=".$ID.")"; $db_res = $DB->Query($strSql); $db_res = new _CForumDBResult($db_res, $arAddParams); $GLOBALS["FORUM_CACHE"]["FORUM"][$ID][$key] = $db_res->Fetch(); if (CACHED_b_forum !== false) $CACHE_MANAGER->Set($cache_id, $GLOBALS["FORUM_CACHE"]["FORUM"][$ID][$key]); } } return $GLOBALS["FORUM_CACHE"]["FORUM"][$ID][$key]; } //---------------> Forum labels public static function InitReadLabels($ID, $arUserGroups) // out-of-date function { $ID = intval($ID); if ($ID <= 0) return false; $arForumCookie = array(); $iCurFirstReadForum = 0; $read_forum_cookie = COption::GetOptionString("main", "cookie_name", "BITRIX_SM")."_FORUM_0"; if (isset($_COOKIE[$read_forum_cookie]) && $_COOKIE[$read_forum_cookie] <> '') { $arForumCookie = explode("/", $_COOKIE[$read_forum_cookie]); $i = 0; while ($i < count($arForumCookie)) { if (intval($arForumCookie[$i]) == $ID) { $iCurFirstReadForum = intval($arForumCookie[$i+1]); break; } $i += 2; } } $read_forum_cookie1 = COption::GetOptionString("main", "cookie_name", "BITRIX_SM")."_FORUM_".$ID; if (isset($_COOKIE[$read_forum_cookie1]) && intval($_COOKIE[$read_forum_cookie1]) > 0) { if ($iCurFirstReadForum < intval($_COOKIE[$read_forum_cookie1])) { $iCurFirstReadForum = intval($_COOKIE[$read_forum_cookie1]); } } if ($_SESSION["first_read_forum_".$ID] == '' || intval($_SESSION["first_read_forum_".$ID])<0) { $_SESSION["first_read_forum_".$ID] = $iCurFirstReadForum; } if (is_null($_SESSION["read_forum_".$ID]) || $_SESSION["read_forum_".$ID] == '') { $_SESSION["read_forum_".$ID] = "0"; } $iLastPostID = 0; $strPerms = CForumNew::GetUserPermission($ID, $arUserGroups); if ($strPerms > "Q"): $db_res = CForumMessage::GetList(array("ID"=>"DESC"), array("FORUM_ID" => $ID, "APPROVED" => "N"), false, 1); if ($db_res && $res = $db_res->Fetch()): $iLastPostID = intval($res["ID"]); endif; endif; if ($iLastPostID <= 0): $res = CForumNew::GetByID($ID); $iLastPostID = intval($res["LAST_MESSAGE_ID"]); endif; if ($iLastPostID > 0) { $i = 0; $arCookieVal = array(); while ($i < count($arForumCookie)) { if (intval($arForumCookie[$i]) != $ID) { $arCookieVal[] = intval($arForumCookie[$i])."/".intval($arForumCookie[$i + 1]); } $i += 2; } $arCookieVal[] = $ID."/".$iLastPostID; //$GLOBALS["APPLICATION"]->set_cookie($read_forum_cookie, $strCookieVal, false, "/", false, false, "Y", ""); $GLOBALS["APPLICATION"]->set_cookie("FORUM_0", implode("/", $arCookieVal), false, "/", false, false, "Y", false); } return true; } public static function SetLabelsBeRead($ID, $arUserGroups) // out-of-date function { $ID = intval($ID); $_SESSION["read_forum_".$ID] = "0"; $strPerms = CForumNew::GetUserPermission($ID, $arUserGroups); $iCurFirstReadForum = 0; if ($strPerms > "Q"): $db_res = CForumMessage::GetList(array("ID"=>"DESC"), array("FORUM_ID" => $ID, "APPROVED" => "N"), false, 1); if ($db_res && $res = $db_res->Fetch()): $iCurFirstReadForum = intval($res["ID"]); endif; endif; $res = CForumNew::GetByID($ID); $iCurFirstReadForum = intval($res["LAST_MESSAGE_ID"]); $_SESSION["first_read_forum_".$ID] = $iCurFirstReadForum; $arForumCookie = array(); $read_forum_cookie = COption::GetOptionString("main", "cookie_name", "BITRIX_SM")."_FORUM_0"; if (isset($_COOKIE[$read_forum_cookie]) && $_COOKIE[$read_forum_cookie] <> '') { $arForumCookie = explode("/", $_COOKIE[$read_forum_cookie]); } $i = 0; $arCookieVal = array(); while ($i < count($arForumCookie)) { if (intval($arForumCookie[$i])!=$ID) { $arCookieVal[] = intval($arForumCookie[$i])."/".intval($arForumCookie[$i+1]); } $i += 2; } $arCookieVal[] = $ID."/".$iCurFirstReadForum; $_COOKIE[$read_forum_cookie] = implode("/", $arCookieVal); // $GLOBALS["APPLICATION"]->set_cookie($read_forum_cookie, $strCookieVal, false, "/", false, false, "Y", ""); $GLOBALS["APPLICATION"]->set_cookie("FORUM_0", implode("/", $arCookieVal), false, "/", false, false, "Y", false); return true; } //---------------> Forum utils public static function SetStat($ID = 0, $arParams = array()) { $enableCalculateStatistics = COption::GetOptionString('forum', 'enable_calculate_statistics', 'Y'); if ($enableCalculateStatistics === 'N') { return; } global $DB; $ID = intval($ID); if ($ID <= 0): return false; endif; $arParams = (is_array($arParams) ? $arParams : array()); $arMessage = !empty($arParams['MESSAGE']['FORUM_ID']) && $arParams['MESSAGE']['FORUM_ID'] == $ID ? $arParams['MESSAGE'] : [] ; $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"]) && !IsModuleInstalled('bitrix24')) { // 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); } /** * Replace path to forum message link. * @param string|null $strPath * @param array $arVals * @return string|array */ public static function PreparePath2Message($strPath, $arVals = array()) { if (!is_array($arVals)) { $arVals = array(); } $pattern = array( '#MESSAGE_ID#' => $arVals['MESSAGE_ID'] ?? null, '#MID#' => $arVals['MESSAGE_ID'] ?? null, '#TOPIC_ID#' => $arVals['TOPIC_ID'] ?? null, '#TID#' => $arVals['TOPIC_ID'] ?? null, '#TITLE_SEO#' => $arVals['TITLE_SEO'] ?? null, '#FORUM_ID#' => $arVals['FORUM_ID'] ?? null, '#FID#' => $arVals['FORUM_ID'] ?? null, '#PARAM1#' => $arVals['PARAM1'] ?? null, '#PARAM2#' => $arVals['PARAM2'] ?? null, '#SOCNET_GROUP_ID#' => $arVals['SOCNET_GROUP_ID'] ?? null, '#OWNER_ID#' => $arVals['OWNER_ID'] ?? null ); if ($strPath === NULL) { return array_keys($pattern); } $strPath = trim($strPath); if ($strPath == '') { return ''; } $strPath = preg_replace('/([^:])(\/{2,})/', '$1/', $strPath); $strPath = str_replace( array_keys($pattern), array_values($pattern), $strPath ); return $strPath; } //---------------> Forum actions public static function OnGroupDelete($GROUP_ID) { global $DB; return $DB->Query("DELETE FROM b_forum_perms WHERE GROUP_ID=".intval($GROUP_ID), true); } public static function OnBeforeLangDelete($lang) { global $DB; $r = CForumNew::GetList(array(), array("LID"=>$lang)); return ($r->Fetch()?false:true); } public static function OnPanelCreate() // out-of-date function { return false; } public static function OnReindex($NS = array(), $oCallback = NULL, $callback_method = "") { return CForumNew::reindex($NS, $oCallback, $callback_method); } public static function ShowPanel($FID, $TID=0, $bGetIcons=false) { global $APPLICATION, $REQUEST_URI, $USER; if(!(($USER->IsAuthorized() || $APPLICATION->ShowPanel===true) && $APPLICATION->ShowPanel!==false)) return; if (!CModule::IncludeModule("forum")) return; $arButtons = array(); $module_permission = $APPLICATION->GetGroupRight("forum"); if ($module_permission > "D") { $arButtons[] = array( "TEXT" => GetMessage("F_FORUMS_LIST"), "IMAGE" => "/bitrix/images/forum/toolbar_button1.gif", "ACTION" => "jsUtils.Redirect(arguments, '/bitrix/admin/forum_admin.php')"); if ($module_permission >= "W" && intval($FID) > 0 && CForumNew::CanUserUpdateForum($FID, $USER->GetUserGroupArray(), $USER->GetID())) { $arButtons[] = array( "TEXT" => GetMessage("F_FORUM_EDIT"), "IMAGE" => "/bitrix/images/forum/toolbar_button2.gif", "ACTION" => "jsUtils.Redirect(arguments, '/bitrix/admin/forum_edit.php?ID=".intval($FID)."')"); } } if (!empty($arButtons)) { $arButton = array( "SRC" => "/bitrix/images/forum/toolbar_button1.gif", "ALT" => GetMessage("F_FORUM_TITLE"), "TEXT" => GetMessage("F_FORUM"), "MAIN_SORT" => 300, "MENU" => $arButtons, "MODE" => 'configure'); $APPLICATION->AddPanelButton($arButton); } } public static function ClearHTML($ID) { global $DB; $ID = intval($ID); $strSql = "UPDATE b_forum_message SET POST_MESSAGE_HTML='', POST_MESSAGE_FILTER='', HTML = '' WHERE FORUM_ID=".$ID; $DB->Query($strSql); return true; } } /**********************************************************************/ /************** FORUM GROUP *******************************************/ /**********************************************************************/ class CAllForumGroup { //---------------> User insert, update, delete public static function CanUserAddGroup($arUserGroups) { return CForumUser::IsAdmin($arUserGroups); } public static function CanUserUpdateGroup($ID, $arUserGroups) { return CForumUser::IsAdmin($arUserGroups); } public static function CanUserDeleteGroup($ID, $arUserGroups) { return CForumUser::IsAdmin($arUserGroups); } public static function CheckFields($ACTION, &$arFields, $ID = false) { $aMsg = array(); if (is_set($arFields, "LANG") || $ACTION=="ADD") { $res = (is_array($arFields["LANG"]) ? $arFields["LANG"] : array()); foreach ($res as $i => $val) { if (empty($res[$i]["LID"]) || empty($res[$i]["NAME"])) { unset($res[$i]); } } $db_lang = CLanguage::GetList("sort", "asc", ["ACTIVE" => "Y"]); while ($arLang = $db_lang->Fetch()) { $bFound = false; foreach ($res as $i => $val) { if (($res[$i]["LID"]==$arLang["LID"]) && (trim($res[$i]["NAME"]) !== "")) $bFound = true; } if (!$bFound) { $aMsg[] = array( "id"=>'FORUM_GROUP[LANG]['.$arLang["LID"].'][NAME]', "text" => GetMessage("FG_ERROR_EMPTY_LID", array("#LID#" => $arLang["LID"], "#LID_NAME#" => $arLang["NAME"]))); } } } if ((is_set($arFields, "SORT") || $ACTION=="ADD") && intval($arFields["SORT"])<=0) $arFields["SORT"] = 150; if ((is_set($arFields, "PARENT_ID") || $ACTION=="ADD")) $arFields["PARENT_ID"] = (intval($arFields["PARENT_ID"]) > 0 ? intval($arFields["PARENT_ID"]) : false); if ($arFields["PARENT_ID"]) { if ($ACTION != "ADD" && $ID == $arFields["PARENT_ID"]) { $aMsg[] = array( "id" => 'FORUM_GROUP[PARENT_ID]', "text" => GetMessage("FG_ERROR_SELF_PARENT_ID")); } else { $res = CForumGroup::GetByID($arFields["PARENT_ID"]); if (!$res) { $aMsg[] = array( "id" => 'FORUM_GROUP[PARENT_ID]', "text" => GetMessage("FG_ERROR_EMPTY_PARENT_ID")); } elseif ($ACTION != "ADD") { $res1 = CForumGroup::GetByID($ID); if ($res1["LEFT_MARGIN"] < $res["LEFT_MARGIN"] && $res["RIGHT_MARGIN"] < $res1["RIGHT_MARGIN"]) $aMsg[] = array( "id" => 'FORUM_GROUP[PARENT_ID]', "text" => GetMessage("FG_ERROR_PARENT_ID_IS_CHILD")); } } } if(!empty($aMsg)) { $e = new CAdminException(array_reverse($aMsg)); $GLOBALS["APPLICATION"]->ThrowException($e); return false; } return true; } public static function Delete($ID) { global $DB; $ID = intval($ID); $aMsg = array(); $res = CForumGroup::GetByIDEx($ID, LANGUAGE_ID); if (!$res) return true; $db_res = CForumGroup::GetList(array(), array("PARENT_ID" => $ID)); if ($db_res->Fetch()) $aMsg[] = array( "id" => 'FORUM_GROUP_GROUPS', "text" => str_replace(array("#GROUP_NAME#", "#GROUP_ID#"), array($res["NAME"], $ID), GetMessage("FG_ERROR_CONTENT_GROUP"))); $db_res = CForumNew::GetList(array(), array("FORUM_GROUP_ID" => $ID)); if ($db_res->Fetch()) $aMsg[] = array( "id" => 'FORUM_GROUP_FORUMS', "text" => str_replace(array("#GROUP_NAME#", "#GROUP_ID#"), array($res["NAME"], $ID), GetMessage("FG_ERROR_CONTENT_FORUM"))); if(!empty($aMsg)) { $e = new CAdminException(array_reverse($aMsg)); $GLOBALS["APPLICATION"]->ThrowException($e); return false; } if(CACHED_b_forum_group !== false) $GLOBALS["CACHE_MANAGER"]->CleanDir("b_forum_group"); $DB->Query("DELETE FROM b_forum_group_lang WHERE FORUM_GROUP_ID = ".$ID, true); $DB->Query("DELETE FROM b_forum_group WHERE ID = ".$ID, true); CAllForumGroup::Resort(); return true; } public static function GetList($arOrder = array("SORT"=>"ASC"), $arFilter = array()) { global $DB; $arSqlSearch = Array(); $strSqlSearch = ""; $arSqlOrder = Array(); $strSqlOrder = ""; $arFilter = (is_array($arFilter) ? $arFilter : array()); foreach ($arFilter as $key => $val) { $key_res = CForumNew::GetFilterOperation($key); $key = mb_strtoupper($key_res["FIELD"]); $strNegative = $key_res["NEGATIVE"]; $strOperation = $key_res["OPERATION"]; switch ($key) { case "ID": case "SORT": case "PARENT_ID": case "LEFT_MARGIN": case "RIGHT_MARGIN": case "DEPTH_LEVEL": if (intval($val)<=0) $arSqlSearch[] = ($strNegative=="Y"?"NOT":"")."(FR.".$key." IS NULL OR FR.".$key."<=0)"; else $arSqlSearch[] = ($strNegative=="Y"?" FR.".$key." IS NULL OR NOT ":"")."(FR.".$key." ".$strOperation." ".intval($val)." )"; break; } } if (!empty($arSqlSearch)) $strSqlSearch = "WHERE (".implode(") AND (", $arSqlSearch).") "; foreach ($arOrder as $by=>$order) { $by = mb_strtoupper($by); $order = mb_strtoupper($order); if ($order!="ASC") $order = "DESC"; if ($by == "ID") $arSqlOrder[] = " FR.ID ".$order." "; elseif ($by == "LEFT_MARGIN") $arSqlOrder[] = " FR.LEFT_MARGIN ".$order." "; else { $arSqlOrder[] = " FR.SORT ".$order." "; $by = "SORT"; } } DelDuplicateSort($arSqlOrder); if (!empty($arSqlOrder)) $strSqlOrder = " ORDER BY ".implode(", ", $arSqlOrder); $strSql = "SELECT FR.ID, FR.SORT, FR.PARENT_ID, FR.LEFT_MARGIN, FR.RIGHT_MARGIN, FR.DEPTH_LEVEL ". "FROM b_forum_group FR ". $strSqlSearch." ". $strSqlOrder." "; $db_res = $DB->Query($strSql); return $db_res; } public static function GetListEx($arOrder = array("SORT"=>"ASC"), $arFilter = array()) { global $DB; $arSqlSearch = Array(); $strSqlSearch = ""; $arSqlOrder = Array(); $strSqlOrder = ""; $arFilter = (is_array($arFilter) ? $arFilter : array()); foreach ($arFilter as $key => $val) { $key_res = CForumNew::GetFilterOperation($key); $key = mb_strtoupper($key_res["FIELD"]); $strNegative = $key_res["NEGATIVE"]; $strOperation = $key_res["OPERATION"]; switch ($key) { case "ID": case "SORT": case "PARENT_ID": case "LEFT_MARGIN": case "RIGHT_MARGIN": case "DEPTH_LEVEL": if (intval($val)<=0) $arSqlSearch[] = ($strNegative=="Y"?"NOT":"")."(FR.".$key." IS NULL OR FR.".$key."<=0)"; else $arSqlSearch[] = ($strNegative=="Y"?" FR.".$key." IS NULL OR NOT ":"")."(FR.".$key." ".$strOperation." ".intval($val)." )"; break; case "LID": if ($val == '') $arSqlSearch[] = ($strNegative=="Y"?"NOT":"")."(FRL.LID IS NULL OR ".($DB->type == "MSSQL" ? "LEN" : "LENGTH")."(FRL.LID)<=0)"; else $arSqlSearch[] = ($strNegative=="Y"?" FRL.LID IS NULL OR NOT ":"")."(FRL.LID ".$strOperation." '".$DB->ForSql($val)."' )"; break; } } if (!empty($arSqlSearch)) $strSqlSearch = " WHERE (".implode(") AND (", $arSqlSearch).") "; foreach ($arOrder as $by=>$order) { $by = mb_strtoupper($by); $order = mb_strtoupper($order); if ($order!="ASC") $order = "DESC"; if ($by == "ID") $arSqlOrder[] = " FR.ID ".$order." "; elseif ($by == "LID") $arSqlOrder[] = " FRL.LID ".$order." "; elseif ($by == "NAME") $arSqlOrder[] = " FRL.NAME ".$order." "; elseif ($by == "LEFT_MARGIN") $arSqlOrder[] = " FR.LEFT_MARGIN ".$order." "; else { $arSqlOrder[] = " FR.SORT ".$order." "; $by = "SORT"; } } DelDuplicateSort($arSqlOrder); if (!empty($arSqlOrder)) $strSqlOrder = "ORDER BY ".implode(", ", $arSqlOrder); $strSql = "SELECT FR.ID, FR.SORT, FR.PARENT_ID, FR.LEFT_MARGIN, FR.RIGHT_MARGIN, FR.DEPTH_LEVEL, FRL.LID, FRL.NAME, FRL.DESCRIPTION ". "FROM b_forum_group FR ". " LEFT JOIN b_forum_group_lang FRL ON FR.ID = FRL.FORUM_GROUP_ID ". $strSqlSearch." ". $strSqlOrder." "; $db_res = $DB->Query($strSql); return $db_res; } public static function GetByID($ID) { global $DB; $ID = intval($ID); $strSql = "SELECT FR.ID, FR.SORT, FR.PARENT_ID, FR.LEFT_MARGIN, FR.RIGHT_MARGIN, FR.DEPTH_LEVEL FROM b_forum_group FR WHERE FR.ID = ".$ID.""; $db_res = $DB->Query($strSql); if ($res = $db_res->Fetch()) { return $res; } return false; } public static function GetByIDEx($ID, $LANGUAGE_ID) { global $DB, $CACHE_MANAGER; $ID = intval($ID); $LANGUAGE_ID = (!empty($LANGUAGE_ID) ? $LANGUAGE_ID : LANGUAGE_ID); $key = $ID."_".$LANGUAGE_ID; $cache_id = "b_forum_group".$key; if ($ID <= 0): return false; elseif (!isset($GLOBALS["FORUM_CACHE"]["GROUP"]) || !is_array($GLOBALS["FORUM_CACHE"]["GROUP"])): $GLOBALS["FORUM_CACHE"]["GROUP"] = array(); endif; if (!array_key_exists($key, $GLOBALS["FORUM_CACHE"]["GROUP"])) { if (CACHED_b_forum_group !== false && $CACHE_MANAGER->Read(CACHED_b_forum_group, $cache_id, "b_forum_group")) { $GLOBALS["FORUM_CACHE"]["GROUP"][$key] = $CACHE_MANAGER->Get($cache_id); } else { $strSql = "SELECT FR.ID, FRL.LID, FRL.NAME, FR.SORT, FRL.DESCRIPTION, FR.PARENT_ID, FR.LEFT_MARGIN, FR.RIGHT_MARGIN, FR.DEPTH_LEVEL ". "FROM b_forum_group FR ". " LEFT JOIN b_forum_group_lang FRL ON (FR.ID = FRL.FORUM_GROUP_ID AND FRL.LID = '".$DB->ForSql($LANGUAGE_ID)."') ". "WHERE FR.ID = ".$ID.""; $db_res = $DB->Query($strSql); $GLOBALS["FORUM_CACHE"]["GROUP"][$key] = $db_res->Fetch(); if (CACHED_b_forum_group !== false) $CACHE_MANAGER->Set($cache_id, $GLOBALS["FORUM_CACHE"]["GROUP"][$key]); } } return $GLOBALS["FORUM_CACHE"]["GROUP"][$key]; } public static function GetLangByID($FORUM_GROUP_ID, $strLang) { global $DB; $FORUM_GROUP_ID = intval($FORUM_GROUP_ID); $strSql = "SELECT FRL.ID, FRL.FORUM_GROUP_ID, FRL.LID, FRL.NAME, FRL.DESCRIPTION ". "FROM b_forum_group_lang FRL ". "WHERE FRL.FORUM_GROUP_ID = ".$FORUM_GROUP_ID." ". " AND FRL.LID = '".$DB->ForSql($strLang)."' "; $db_res = $DB->Query($strSql); if ($res = $db_res->Fetch()) { return $res; } return false; } public static function GetByLang($LANGUAGE_ID) { global $CACHE_MANAGER; $LANGUAGE_ID = (!empty($LANGUAGE_ID) ? $LANGUAGE_ID : LANGUAGE_ID); $cache_id = "b_forum_group".$LANGUAGE_ID; if (!isset($GLOBALS["FORUM_CACHE"]["GROUPS"])): $GLOBALS["FORUM_CACHE"]["GROUPS"] = array(); endif; if (!array_key_exists($LANGUAGE_ID, $GLOBALS["FORUM_CACHE"]["GROUPS"])) { if (CACHED_b_forum_group !== false && $CACHE_MANAGER->Read(CACHED_b_forum_group, $cache_id, "b_forum_group")) { $GLOBALS["FORUM_CACHE"]["GROUPS"][$LANGUAGE_ID] = $CACHE_MANAGER->Get($cache_id); } else { $arRes = array(); $db_res = CForumGroup::GetListEx(array("LEFT_MARGIN" => "ASC", "SORT" => "ASC"), array("LID" => $LANGUAGE_ID)); while ($res = $db_res->GetNext()) $arRes[intval($res["ID"])] = $res; $GLOBALS["FORUM_CACHE"]["GROUPS"][$LANGUAGE_ID] = $arRes; if (CACHED_b_forum_group !== false) $CACHE_MANAGER->Set($cache_id, $GLOBALS["FORUM_CACHE"]["GROUPS"][$LANGUAGE_ID]); } } return $GLOBALS["FORUM_CACHE"]["GROUPS"][$LANGUAGE_ID]; } public static function Resort($ID=0, $cnt=0, $depth=0) { global $DB; $ID = intval($ID); if($ID > 0) $DB->Query("UPDATE b_forum_group SET RIGHT_MARGIN=".intval($cnt).", LEFT_MARGIN=".intval($cnt)." WHERE ID=".intval($ID)); $strSql = "SELECT FG.ID, FG.PARENT_ID FROM b_forum_group FG WHERE ".($ID>0?"FG.PARENT_ID=".$ID:"FG.PARENT_ID IS NULL")." ORDER BY FG.SORT ASC"; $cnt++; $db_res = $DB->Query($strSql); while ($res = $db_res->Fetch()) $cnt = CAllForumGroup::ReSort($res["ID"], $cnt, $depth+1); if($ID == 0) return true; $DB->Query("UPDATE b_forum_group SET RIGHT_MARGIN=".intval($cnt).", DEPTH_LEVEL=".intval($depth)." WHERE ID=".intval($ID)); return $cnt+1; } } /**********************************************************************/ /************** FORUM SMILE *******************************************/ /**********************************************************************/ class CForumSmile { static $smiles = array(); static $sets = array(); public static function Add() { return false; } public static function CheckFields() { return false; } public static function Update() { return false; } public static function Delete() { return false; } public static function GetList() { global $DB; return $DB->Query(""); } public static function GetListEx() { global $DB; return $DB->Query(""); } public static function GetByID() { return false; } public static function GetByIDEx($ID, $strLang) { return false; } public static function GetLangByID($SMILE_ID, $strLang) { return false; } /** * @deprecated * @param $type * @param $lang * @return mixed */ public static function GetByType($type, $lang) { if (COption::GetOptionInt("forum", "smile_native_gallery_id", 0) <= 0) return self::getSmiles($type, $lang); $type = ($type == "I" ? CSmile::TYPE_ICON : CSmile::TYPE_SMILE); $key = "old_".$type."_".$lang; if (!array_key_exists($key, self::$smiles)) { $smiles = CSmile::getByGalleryId($type, COption::GetOptionInt("forum", "smile_native_gallery_id", 0), $lang); $result = array(); foreach ($smiles as $smile) { if ($smile['HIDDEN'] == 'Y') continue; $result[] = array( 'ID' => $smile['ID'], 'TYPE' => $type, 'TYPING' => $smile['TYPING'], 'IMAGE' => $smile["IMAGE"], 'DESCRIPTION' => '', 'CLICKABLE' => 'Y', 'SORT' => $smile['SORT'], 'IMAGE_WIDTH' => $smile['IMAGE_WIDTH'], 'IMAGE_HEIGHT' => $smile['IMAGE_HEIGHT'], 'SET_ID' => $smile['SET_ID'], 'NAME' => $smile['NAME'], 'WIDTH' => $smile['IMAGE_WIDTH'], 'HEIGHT' => $smile['IMAGE_HEIGHT'], ); } self::$smiles[$key] = $result; } return self::$smiles[$key]; } public static function getSmiles($type, $lang) { $type = ($type == "I" ? CSmile::TYPE_ICON : CSmile::TYPE_SMILE); $key = "new_".$type."_".$lang; if (!array_key_exists($key, self::$smiles)) { $smiles = CSmile::getByGalleryId($type, COption::GetOptionInt("forum", "smile_gallery_id", 0), $lang); $result = array(); foreach ($smiles as $smile) { if ($smile['HIDDEN'] == 'Y') continue; $result[] = array( 'SET_ID' => $smile['SET_ID'], 'NAME' => $smile['NAME'], 'IMAGE' => ($smile['TYPE'] == CSmile::TYPE_SMILE ? CSmile::PATH_TO_SMILE : CSmile::PATH_TO_ICON).$smile["SET_ID"]."/".$smile["IMAGE"], 'TYPING' => $smile['TYPING'], 'WIDTH' => $smile['IMAGE_WIDTH'], 'HEIGHT' => $smile['IMAGE_HEIGHT'], ); } self::$smiles[$key] = $result; } return self::$smiles[$key]; } public static function getSetsByType($type, $lang) { $type = ($type == CSmile::TYPE_ICON ? CSmile::TYPE_ICON : CSmile::TYPE_SMILE); $key = $type."_".$lang; if (!array_key_exists($key, self::$sets)) { $smiles = self::GetByType($type, $lang); $smilesSet = CSmileSet::getListCache(); $result = array(); foreach ($smiles as $smile) { if (!array_key_exists($smile["SET_ID"], $result)) { $result[$smile["SET_ID"]] = $smilesSet[$smile["SET_ID"]]; } } self::$sets[$key] = $result; } return self::$sets[$key]; } } class _CForumDBResult extends CDBResult { var $sNameTemplate = ''; public function __construct($res, $params = array()) { $this->sNameTemplate = (!empty($params["sNameTemplate"]) ? $params["sNameTemplate"] : ''); parent::__construct($res); } function Fetch() { global $DB; if($res = parent::Fetch()) { if (COption::GetOptionString("forum", "FILTER", "Y") == "Y") { if (trim($res["HTML"]) <> '') { $arr = unserialize($res["HTML"], ["allowed_classes" => false]); if (is_array($arr) && count($arr) > 0): $res["LAST_POSTER_NAME"] = $arr["LAST_POSTER_NAME"]; endif; } if (trim($res["TOPIC_HTML"] ?? '') <> '') { $arr = unserialize($res["TOPIC_HTML"], ["allowed_classes" => false]); if (is_array($arr) && is_set($arr, "TITLE")) $res["TITLE"] = $arr["TITLE"]; } if (trim($res["ABS_TOPIC_HTML"] ?? '') <> '') { $arr = unserialize($res["ABS_TOPIC_HTML"], ["allowed_classes" => false]); if (is_array($arr)) { if (is_set($arr, "TITLE")) $res["ABS_TITLE"] = $arr["TITLE"]; if (is_set($arr, "ABS_LAST_POSTER_NAME")) $res["ABS_LAST_POSTER_NAME"] = $arr["ABS_LAST_POSTER_NAME"]; } } } if (!empty($this->sNameTemplate)) { $arTmp = array(); foreach (array("LAST_POSTER_ID" => "LAST_POSTER_NAME", "ABS_LAST_POSTER_ID" => "ABS_LAST_POSTER_NAME") as $id => $name) { $tmp = ""; if (!empty($res[$id])) { if (in_array($res[$id], $arTmp)) { $tmp = $arTmp[$res[$id]]; } else { $arTmp[$res[$id]] = $tmp = (!empty($res[$name."_FRMT"]) ? $res[$name."_FRMT"] : CForumUser::GetFormattedNameByUserID($res[$id], $this->sNameTemplate)); } } $res[$name] = (!empty($tmp) ? $tmp : $res[$name]); } } } return $res; } }