Server IP : 80.87.202.40 / Your IP : 216.73.216.169 Web Server : Apache System : Linux rospirotorg.ru 5.14.0-539.el9.x86_64 #1 SMP PREEMPT_DYNAMIC Thu Dec 5 22:26:13 UTC 2024 x86_64 User : bitrix ( 600) PHP Version : 8.2.27 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : OFF | Sudo : ON | Pkexec : ON Directory : /home/bitrix/ext_www/rospirotorg.ru/bitrix/modules/main/classes/general/ |
Upload File : |
<?php IncludeModuleLangFile(__FILE__); class CRatingRulesMain { // return configs public static function OnGetRatingRuleConfigs() { $arConfigs["USER"]["CONDITION_CONFIG"][] = [ "ID" => 'RATING', "NAME" => GetMessage('PP_USER_CONDITION_RATING_NAME'), "DESC" => GetMessage('PP_USER_CONDITION_RATING_DESC'), "REFRESH_TIME" => '3600', "CLASS" => 'CRatingRulesMain', "METHOD" => 'ratingCheck', "FIELDS" => [ [ "TYPE" => 'SELECT_CLASS', "ID" => 'RATING_ID', "NAME" => GetMessage('PP_USER_CONDITION_RATING_RATING_ID'), "DEFAULT" => '1', "CLASS" => 'CRatings', "METHOD" => 'GetList', "PARAMS" => [["ID" => "ASC"], ["ACTIVE" => "Y", "ENTITY_ID" => "USER"]], "FIELD_ID" => 'ID', "FIELD_VALUE" => 'NAME', ], [ "TYPE" => 'SELECT_ARRAY_WITH_INPUT', "ID" => 'RATING_CONDITION', "ID_INPUT" => 'RATING_VALUE', "NAME" => GetMessage('PP_USER_CONDITION_RATING_RATING_CONDITION'), "DEFAULT" => '1', "DEFAULT_INPUT" => '500', "PARAMS" => ['1' => GetMessage('PP_USER_CONDITION_RATING_RATING_CONDITION_1'), '2' => GetMessage('PP_USER_CONDITION_RATING_RATING_CONDITION_2')], ], ], ]; $arConfigs["USER"]["CONDITION_CONFIG"][] = [ "ID" => 'RATING_INTERVAL', "NAME" => GetMessage('PP_USER_CONDITION_RATING_INTERVAL_NAME'), "DESC" => GetMessage('PP_USER_CONDITION_RATING_INTERVAL_DESC'), "REFRESH_TIME" => '3600', "CLASS" => 'CRatingRulesMain', "METHOD" => 'ratingCheckInterval', "FIELDS" => [ [ "TYPE" => 'SELECT_CLASS', "ID" => 'RATING_ID', "NAME" => GetMessage('PP_USER_CONDITION_RATING_RATING_ID'), "DEFAULT" => '1', "CLASS" => 'CRatings', "METHOD" => 'GetList', "PARAMS" => [["ID" => "ASC"], ["ACTIVE" => "Y", "ENTITY_ID" => "USER"]], "FIELD_ID" => 'ID', "FIELD_VALUE" => 'NAME', ], [ "TYPE" => 'INPUT_INTERVAL', "ID" => 'RATING_VALUE_FROM', "ID_2" => 'RATING_VALUE_TO', "NAME" => GetMessage('PP_USER_CONDITION_RATING_INTERVAL'), "DEFAULT" => '0', "DEFAULT_2" => '500', ], ], ]; $arConfigs["USER"]["CONDITION_CONFIG"][] = [ "ID" => 'AUTHORITY', "NAME" => GetMessage('PP_USER_CONDITION_AUTHORITY_NAME'), "DESC" => (COption::GetOptionString("main", "rating_weight_type", "auto") == "auto" ? GetMessage('PP_USER_CONDITION_AUTHORITY_AUTO_DESC') : GetMessage('PP_USER_CONDITION_AUTHORITY_DESC')), "REFRESH_TIME" => '3600', "CLASS" => 'CRatingRulesMain', "METHOD" => 'ratingCheck', "FIELDS" => [ [ "TYPE" => 'SELECT_ARRAY_WITH_INPUT', "ID" => 'RATING_CONDITION', "ID_INPUT" => 'RATING_VALUE', "NAME" => (COption::GetOptionString("main", "rating_weight_type", "auto") == "auto" ? GetMessage('PP_USER_CONDITION_AUTHORITY_RATING_CONDITION_AUTO') : GetMessage('PP_USER_CONDITION_AUTHORITY_RATING_CONDITION')), "DEFAULT" => '1', "DEFAULT_INPUT" => '1', "PARAMS" => ['1' => GetMessage('PP_USER_CONDITION_RATING_RATING_CONDITION_1'), '2' => GetMessage('PP_USER_CONDITION_RATING_RATING_CONDITION_2')], ], ], ]; $arConfigs["USER"]["CONDITION_CONFIG"][] = [ "ID" => 'AUTHORITY_INTERVAL', "NAME" => GetMessage('PP_USER_CONDITION_AUTHORITY_INTERVAL_NAME'), "DESC" => (COption::GetOptionString("main", "rating_weight_type", "auto") == "auto" ? GetMessage('PP_USER_CONDITION_AUTHORITY_INTERVAL_AUTO_DESC') : GetMessage('PP_USER_CONDITION_AUTHORITY_INTERVAL_DESC')), "REFRESH_TIME" => '3600', "CLASS" => 'CRatingRulesMain', "METHOD" => 'ratingCheckInterval', "FIELDS" => [ [ "TYPE" => 'INPUT_INTERVAL', "ID" => 'RATING_VALUE_FROM', "ID_2" => 'RATING_VALUE_TO', "NAME" => (COption::GetOptionString("main", "rating_weight_type", "auto") == "auto" ? GetMessage('PP_USER_CONDITION_AUTHORITY_INTERVAL_AUTO') : GetMessage('PP_USER_CONDITION_AUTHORITY_INTERVAL')), "DEFAULT" => '0', "DEFAULT_2" => '10', ], ], ]; $arConfigs["USER"]["CONDITION_CONFIG"][] = [ "ID" => 'VOTE', "NAME" => GetMessage('PP_USER_CONDITION_VOTE_NAME'), "DESC" => '', "REFRESH_TIME" => '86400', "CLASS" => 'CRatingRulesMain', "METHOD" => 'voteCheck', "FIELDS" => [ [ "TYPE" => 'TEXT', "NAME" => GetMessage('PP_USER_CONDITION_VOTE_TEXT'), ], [ "TYPE" => 'INPUT', "ID" => 'VOTE_LIMIT', "NAME" => GetMessage('PP_USER_CONDITION_VOTE_LIMIT'), "NAME_DESC" => GetMessage('PP_USER_CONDITION_VOTE_LIMIT_DESC'), "DEFAULT" => '90', "SIZE" => '2', ], [ "TYPE" => 'INPUT', "ID" => 'VOTE_RESULT', "NAME" => GetMessage('PP_USER_CONDITION_VOTE_RESULT'), "DEFAULT" => '10', "SIZE" => '2', ], [ "TYPE" => 'SEPARATOR', "NAME" => GetMessage('PP_USER_CONDITION_VOTE_SEPARATOR'), ], [ "TYPE" => 'INPUT', "ID" => 'VOTE_FORUM_TOPIC', "NAME" => GetMessage('PP_USER_CONDITION_VOTE_FT'), "DEFAULT" => '0.5', "SIZE" => '2', ], [ "TYPE" => 'INPUT', "ID" => 'VOTE_FORUM_POST', "NAME" => GetMessage('PP_USER_CONDITION_VOTE_FP'), "DEFAULT" => '0.1', "SIZE" => '2', ], [ "TYPE" => 'INPUT', "ID" => 'VOTE_BLOG_POST', "NAME" => GetMessage('PP_USER_CONDITION_VOTE_BP'), "DEFAULT" => '0.5', "SIZE" => '2', ], [ "TYPE" => 'INPUT', "ID" => 'VOTE_BLOG_COMMENT', "NAME" => GetMessage('PP_USER_CONDITION_VOTE_BC'), "DEFAULT" => '0.1', "SIZE" => '2', ], ], 'HIDE_ACTION' => true, ]; $arConfigs["USER"]["ACTION_CONFIG"][] = [ "ID" => 'ADD_TO_GROUP', "NAME" => GetMessage('PP_USER_ACTION_ADD_TO_GROUP'), "DESC" => GetMessage('PP_USER_ACTION_ADD_TO_GROUP_DESC'), "CLASS" => 'CRatingRulesMain', "METHOD" => 'addToGroup', "FIELDS" => [ [ "ID" => 'GROUP_ID', "NAME" => GetMessage('PP_USER_ACTION_CHANGE_GROUP_GROUP_ID'), "DEFAULT" => '4', "TYPE" => 'SELECT_CLASS', "CLASS" => 'CGroup', "METHOD" => 'GetList', "PARAMS" => ['ID', 'DESC', []], "FIELD_ID" => 'ID', "FIELD_VALUE" => 'NAME', ], ], ]; $arConfigs["USER"]["ACTION_CONFIG"][] = [ "ID" => 'REMOVE_FROM_GROUP', "NAME" => GetMessage('PP_USER_ACTION_REMOVE_FROM_GROUP'), "DESC" => GetMessage('PP_USER_ACTION_REMOVE_FROM_GROUP_DESC'), "CLASS" => 'CRatingRulesMain', "METHOD" => 'removeFromGroup', "FIELDS" => [ [ "ID" => 'GROUP_ID', "NAME" => GetMessage('PP_USER_ACTION_CHANGE_GROUP_GROUP_ID'), "DEFAULT" => '4', "TYPE" => 'SELECT_CLASS', "CLASS" => 'CGroup', "METHOD" => 'GetList', "PARAMS" => ['ID', 'ASC', []], "FIELD_ID" => 'ID', "FIELD_VALUE" => 'NAME', ], ], ]; $arConfigs["USER"]["ACTION_CONFIG"][] = [ "ID" => 'CHANGE_UF', "NAME" => GetMessage('PP_USER_ACTION_CHANGE_UF'), "DESC" => GetMessage('PP_USER_ACTION_CHANGE_UF_DESC'), "CLASS" => 'CRatingRulesMain', "METHOD" => 'changeUF', "FIELDS" => [ [ "ID" => 'UF_ID', "NAME" => GetMessage('PP_USER_ACTION_CHANGE_UF_ID'), "DEFAULT" => '', "TYPE" => 'SELECT_CLASS_ARRAY', "CLASS" => 'CRatingRulesMain', "METHOD" => 'GetUfList', "PARAMS" => [], "FIELD_ID" => 'ID', "FIELD_VALUE" => 'NAME', ], [ "ID" => 'UF_VALUE', "NAME" => GetMessage('PP_USER_ACTION_CHANGE_UF_VALUE'), "DEFAULT" => '', ], ], ]; return $arConfigs; } public static function ratingCheck($arConfigs) { global $DB; $ruleId = intval($arConfigs['ID']); if (isset($arConfigs['CONDITION_CONFIG']['RATING'])) { $ratingValue = intval($arConfigs['CONDITION_CONFIG']['RATING']['RATING_VALUE']); $ratingCondition = ($arConfigs['CONDITION_CONFIG']['RATING']['RATING_CONDITION'] == 1 ? '>=' : '<'); $ratingId = intval($arConfigs['CONDITION_CONFIG']['RATING']['RATING_ID']); } else { $ratingVoteWeight = COption::GetOptionString("main", "rating_vote_weight", 1); $ratingValue = intval($arConfigs['CONDITION_CONFIG']['AUTHORITY']['RATING_VALUE']) * $ratingVoteWeight; $ratingCondition = ($arConfigs['CONDITION_CONFIG']['AUTHORITY']['RATING_CONDITION'] == 1 ? '>=' : '<'); $ratingId = CRatings::GetAuthorityRating(); } $strSql = "INSERT INTO b_rating_rule_vetting (RULE_ID, ENTITY_TYPE_ID, ENTITY_ID) SELECT '$ruleId' as RULE_ID, rr.ENTITY_TYPE_ID as ENTITY_TYPE_ID, rr.ENTITY_ID as ENTITY_ID FROM b_rating_results rr WHERE rr.RATING_ID = $ratingId AND rr.CURRENT_VALUE $ratingCondition $ratingValue"; $res = $DB->Query($strSql); return true; } public static function ratingCheckInterval($arConfigs) { global $DB; $ruleId = intval($arConfigs['ID']); if (isset($arConfigs['CONDITION_CONFIG']['RATING_INTERVAL'])) { $ratingValueFrom = intval($arConfigs['CONDITION_CONFIG']['RATING_INTERVAL']['RATING_VALUE_FROM']); $ratingValueTo = intval($arConfigs['CONDITION_CONFIG']['RATING_INTERVAL']['RATING_VALUE_TO']); $ratingId = intval($arConfigs['CONDITION_CONFIG']['RATING_INTERVAL']['RATING_ID']); } else { $ratingVoteWeight = COption::GetOptionString("main", "rating_vote_weight", 1); $ratingValueFrom = intval($arConfigs['CONDITION_CONFIG']['AUTHORITY_INTERVAL']['RATING_VALUE_FROM']) * $ratingVoteWeight; $ratingValueTo = intval($arConfigs['CONDITION_CONFIG']['AUTHORITY_INTERVAL']['RATING_VALUE_TO']) * $ratingVoteWeight; $ratingId = CRatings::GetAuthorityRating(); } $strSql = "INSERT INTO b_rating_rule_vetting (RULE_ID, ENTITY_TYPE_ID, ENTITY_ID) SELECT '$ruleId' as RULE_ID, rr.ENTITY_TYPE_ID as ENTITY_TYPE_ID, rr.ENTITY_ID as ENTITY_ID FROM b_rating_results rr WHERE rr.RATING_ID = $ratingId AND rr.CURRENT_VALUE BETWEEN $ratingValueFrom AND $ratingValueTo"; $DB->Query($strSql); return true; } public static function addToGroup($arConfigs) { global $DB; $ruleId = intval($arConfigs['ID']); $groupId = intval($arConfigs['ACTION_CONFIG']['ADD_TO_GROUP']['GROUP_ID']); $entityTypeId = $DB->ForSql($arConfigs['ENTITY_TYPE_ID']); // add a group to all users who do not, but you need to add it $strSql = " SELECT prv.ENTITY_ID FROM b_rating_rule_vetting prv WHERE prv.RULE_ID = $ruleId AND prv.ENTITY_TYPE_ID = '$entityTypeId' AND prv.ENTITY_ID NOT IN ( SELECT ug.USER_ID FROM b_user_group ug WHERE ug.GROUP_ID = $groupId ) AND prv.APPLIED = 'N' GROUP BY prv.ENTITY_ID "; $res = $DB->Query($strSql); while ($user = $res->Fetch()) { CUser::AppendUserGroup($user['ENTITY_ID'], [$groupId]); } CRatingRule::ApplyVetting($arConfigs); return true; } public static function removeFromGroup($arConfigs) { global $DB; $ruleId = intval($arConfigs['ID']); $groupId = intval($arConfigs['ACTION_CONFIG']['REMOVE_FROM_GROUP']['GROUP_ID']); $entityTypeId = $DB->ForSql($arConfigs['ENTITY_TYPE_ID']); // remove the group from all users who it is, but you need to remove it $strSql = " SELECT prv.ENTITY_ID FROM b_rating_rule_vetting prv WHERE prv.RULE_ID = $ruleId and prv.ENTITY_TYPE_ID = '$entityTypeId' and prv.ENTITY_ID IN ( SELECT ug.USER_ID FROM b_user_group ug WHERE ug.GROUP_ID = $groupId ) and prv.APPLIED = 'N' GROUP BY prv.ENTITY_ID "; $res = $DB->Query($strSql); while ($user = $res->Fetch()) { CUser::RemoveUserGroup($user['ENTITY_ID'], [$groupId]); } CRatingRule::ApplyVetting($arConfigs); return true; } public static function GetUfList() { $arFields = []; $rsData = CUserTypeEntity::GetList([], ['ENTITY_ID' => 'USER', 'LANG' => LANG]); while ($arRes = $rsData->Fetch()) { if ($arRes['MULTIPLE'] == 'N' && in_array($arRes['USER_TYPE_ID'], ['integer', 'string_formatted', 'string', 'double'])) { $arFields[$arRes['FIELD_NAME']] = empty($arRes['LIST_FILTER_LABEL']) ? $arRes['FIELD_NAME'] : $arRes['LIST_FILTER_LABEL'] . ' (' . $arRes['FIELD_NAME'] . ')'; } } return $arFields; } public static function changeUF($arConfigs) { global $DB; $ruleId = intval($arConfigs['ID']); $entityTypeId = $DB->ForSql($arConfigs['ENTITY_TYPE_ID']); $userFieldId = $DB->ForSql($arConfigs['ACTION_CONFIG']['CHANGE_UF']['UF_ID']); $userFieldValue = $DB->ForSql($arConfigs['ACTION_CONFIG']['CHANGE_UF']['UF_VALUE']); if (!empty($userFieldId)) { $strSql = "UPDATE b_uts_user uts SET uts.$userFieldId = '$userFieldValue' WHERE uts.VALUE_ID IN ( SELECT prv.ENTITY_ID FROM b_rating_rule_vetting prv WHERE prv.RULE_ID = $ruleId AND prv.ENTITY_TYPE_ID = '$entityTypeId' AND prv.APPLIED = 'N' )"; $DB->Query($strSql); $strSql = "INSERT INTO b_uts_user (VALUE_ID, $userFieldId) SELECT prv.ENTITY_ID, '$userFieldValue' as UF_VALUE FROM b_rating_rule_vetting prv WHERE prv.RULE_ID = $ruleId and prv.ENTITY_TYPE_ID = '$entityTypeId' and prv.ENTITY_ID NOT IN ( SELECT uf.VALUE_ID FROM b_uts_user uf ) and prv.APPLIED = 'N' GROUP BY ENTITY_ID "; $DB->Query($strSql); } CRatingRule::ApplyVetting($arConfigs); return true; } // return support object public static function OnGetRatingRuleObjects() { $arRatingRulesConfigs = CRatingRulesMain::OnGetRatingRuleConfigs(); foreach ($arRatingRulesConfigs as $SupportType => $value) { $arSupportType[] = $SupportType; } return $arSupportType; } // check the value which relate to the module public static function OnAfterAddRatingRule($ID, $arFields) { $arFields = CRatingRulesMain::__CheckFields($arFields['ENTITY_TYPE_ID'], $arFields); return $arFields; } // check the value which relate to the module public static function OnAfterUpdateRatingRule($ID, $arFields) { $arFields = CRatingRulesMain::__CheckFields($arFields['ENTITY_TYPE_ID'], $arFields); return $arFields; } // check input values, if value does not validate, set the default value public static function __CheckFields($entityId, $arConfigs) { $arDefaultConfig = CRatingRulesMain::__AssembleConfigDefault($entityId); if ($entityId == "USER") { if (isset($arConfigs['CONDITION_CONFIG']['RATING'])) { if (!preg_match('/^\d{1,11}$/', $arConfigs['CONDITION_CONFIG']['RATING']['RATING_ID'])) { $arConfigs['CONDITION_CONFIG']['RATING']['RATING_ID'] = $arDefaultConfig['CONDITION_CONFIG']['RATING']['RATING_ID']['DEFAULT']; } if (!in_array($arConfigs['CONDITION_CONFIG']['RATING']['RATING_CONDITION'], [1, 2])) { $arConfigs['CONDITION_CONFIG']['RATING']['RATING_CONDITION'] = $arDefaultConfig['CONDITION_CONFIG']['RATING']['RATING_CONDITION']['DEFAULT']; } if (!preg_match('/^\d{1,11}$/', $arConfigs['CONDITION_CONFIG']['RATING']['RATING_VALUE'])) { $arConfigs['CONDITION_CONFIG']['RATING']['RATING_VALUE'] = $arDefaultConfig['CONDITION_CONFIG']['RATING']['RATING_CONDITION']['DEFAULT_INPUT']; } } if (isset($arConfigs['CONDITION_CONFIG']['RATING_INTERVAL'])) { if (!preg_match('/^\d{1,11}$/', $arConfigs['CONDITION_CONFIG']['RATING_INTERVAL']['RATING_ID'])) { $arConfigs['CONDITION_CONFIG']['RATING_INTERVAL']['RATING_ID'] = $arDefaultConfig['CONDITION_CONFIG']['RATING_INTERVAL']['RATING_ID']['DEFAULT']; } if (!preg_match('/^\d{1,11}$/', $arConfigs['CONDITION_CONFIG']['RATING_INTERVAL']['RATING_VALUE_FROM'])) { $arConfigs['CONDITION_CONFIG']['RATING_INTERVAL']['RATING_VALUE_FROM'] = $arDefaultConfig['CONDITION_CONFIG']['RATING_INTERVAL']['RATING_VALUE_FROM']['DEFAULT']; } if (!preg_match('/^\d{1,11}$/', $arConfigs['CONDITION_CONFIG']['RATING_INTERVAL']['RATING_VALUE_TO'])) { $arConfigs['CONDITION_CONFIG']['RATING_INTERVAL']['RATING_VALUE_TO'] = $arDefaultConfig['CONDITION_CONFIG']['RATING_INTERVAL']['RATING_VALUE_FROM']['DEFAULT_2']; } } if (isset($arConfigs['CONDITION_CONFIG']['AUTHORITY'])) { if (!in_array($arConfigs['CONDITION_CONFIG']['AUTHORITY']['RATING_CONDITION'], [1, 2])) { $arConfigs['CONDITION_CONFIG']['AUTHORITY']['RATING_CONDITION'] = $arDefaultConfig['CONDITION_CONFIG']['AUTHORITY']['RATING_CONDITION']['DEFAULT']; } if (!preg_match('/^\d{1,11}$/', $arConfigs['CONDITION_CONFIG']['AUTHORITY']['RATING_VALUE'])) { $arConfigs['CONDITION_CONFIG']['AUTHORITY']['RATING_VALUE'] = $arDefaultConfig['CONDITION_CONFIG']['AUTHORITY']['RATING_CONDITION']['DEFAULT_INPUT']; } } if (isset($arConfigs['CONDITION_CONFIG']['AUTHORITY_INTERVAL'])) { if (!preg_match('/^\d{1,11}$/', $arConfigs['CONDITION_CONFIG']['AUTHORITY_INTERVAL']['RATING_VALUE_FROM'])) { $arConfigs['CONDITION_CONFIG']['AUTHORITY_INTERVAL']['RATING_VALUE_FROM'] = $arDefaultConfig['CONDITION_CONFIG']['AUTHORITY_INTERVAL']['RATING_VALUE_FROM']['DEFAULT']; } if (!preg_match('/^\d{1,11}$/', $arConfigs['CONDITION_CONFIG']['AUTHORITY_INTERVAL']['RATING_VALUE_TO'])) { $arConfigs['CONDITION_CONFIG']['AUTHORITY_INTERVAL']['RATING_VALUE_TO'] = $arDefaultConfig['CONDITION_CONFIG']['AUTHORITY_INTERVAL']['RATING_VALUE_FROM']['DEFAULT_2']; } } if (isset($arConfigs['CONDITION_CONFIG']['VOTE'])) { if (!preg_match('/^\d{1,3}$/', $arConfigs['CONDITION_CONFIG']['VOTE']['VOTE_LIMIT'])) { $arConfigs['CONDITION_CONFIG']['VOTE']['VOTE_LIMIT'] = $arDefaultConfig['CONDITION_CONFIG']['VOTE']['VOTE_LIMIT']['DEFAULT']; } if (!preg_match('/^\d{1,7}\.?\d{0,4}$/', $arConfigs['CONDITION_CONFIG']['VOTE']['VOTE_RESULT']) || $arConfigs['CONDITION_CONFIG']['VOTE']['VOTE_RESULT'] < 0) { $arConfigs['CONDITION_CONFIG']['VOTE']['VOTE_RESULT'] = $arDefaultConfig['CONDITION_CONFIG']['VOTE']['VOTE_RESULT']['DEFAULT']; } if (!preg_match('/^\d{1,7}\.?\d{0,4}$/', $arConfigs['CONDITION_CONFIG']['VOTE']['VOTE_FORUM_TOPIC'])) { $arConfigs['CONDITION_CONFIG']['VOTE']['VOTE_FORUM_TOPIC'] = $arDefaultConfig['CONDITION_CONFIG']['VOTE']['VOTE_FORUM_TOPIC']['DEFAULT']; } if (!preg_match('/^\d{1,7}\.?\d{0,4}$/', $arConfigs['CONDITION_CONFIG']['VOTE']['VOTE_FORUM_POST'])) { $arConfigs['CONDITION_CONFIG']['VOTE']['VOTE_FORUM_POST'] = $arDefaultConfig['CONDITION_CONFIG']['VOTE']['VOTE_FORUM_POST']['DEFAULT']; } if (!preg_match('/^\d{1,7}\.?\d{0,4}$/', $arConfigs['CONDITION_CONFIG']['VOTE']['VOTE_BLOG_POST'])) { $arConfigs['CONDITION_CONFIG']['VOTE']['VOTE_BLOG_POST'] = $arDefaultConfig['CONDITION_CONFIG']['VOTE']['VOTE_BLOG_POST']['DEFAULT']; } if (!preg_match('/^\d{1,7}\.?\d{0,4}$/', $arConfigs['CONDITION_CONFIG']['VOTE']['VOTE_BLOG_COMMENT'])) { $arConfigs['CONDITION_CONFIG']['VOTE']['VOTE_BLOG_COMMENT'] = $arDefaultConfig['CONDITION_CONFIG']['VOTE']['VOTE_BLOG_COMMENT']['DEFAULT']; } } if (isset($arConfigs['ACTION_CONFIG']['CHANGE_GROUP'])) { if (!preg_match('/^\d{1,11}$/', $arConfigs['ACTION_CONFIG']['CHANGE_GROUP']['GROUP_ID'])) { $arConfigs['ACTION_CONFIG']['CHANGE_GROUP']['GROUP_ID'] = $arDefaultConfig['ACTION_CONFIG']['CHANGE_GROUP']['GROUP_ID']['DEFAULT']; } } if (isset($arConfigs['ACTION_CONFIG']['CHANGE_UF'])) { if (!preg_match('/^[0-9A-Z_]+$/', $arConfigs['ACTION_CONFIG']['CHANGE_UF']['UF_ID'])) { $arConfigs['ACTION_CONFIG']['CHANGE_UF']['UF_ID'] = $arDefaultConfig['ACTION_CONFIG']['CHANGE_UF']['UF_ID']['DEFAULT']; } } } return $arConfigs; } // assemble config default value public static function __AssembleConfigDefault($objectType = null) { $arConfigs = []; $arRatingRuleConfigs = CRatingRulesMain::OnGetRatingRuleConfigs(); if (is_null($objectType)) { foreach ($arRatingRuleConfigs as $OBJ_TYPE => $TYPE_VALUE) { foreach ($TYPE_VALUE as $RULE_TYPE => $RULE_VALUE) { foreach ($RULE_VALUE as $VALUE_CONFIG) { foreach ($VALUE_CONFIG['FIELDS'] as $VALUE_FIELDS) { $arConfigs[$OBJ_TYPE][$RULE_TYPE][$VALUE_CONFIG['ID']][$VALUE_FIELDS['ID']]['DEFAULT'] = $VALUE_FIELDS['DEFAULT']; if (isset($arConfigs[$OBJ_TYPE][$RULE_TYPE][$VALUE_CONFIG['ID']][$VALUE_FIELDS['ID']]['DEFAULT_INPUT'])) { $arConfigs[$OBJ_TYPE][$RULE_TYPE][$VALUE_CONFIG['ID']][$VALUE_FIELDS['ID']]['DEFAULT_INPUT'] = $VALUE_FIELDS['DEFAULT_INPUT']; } } } } } } else { foreach ($arRatingRuleConfigs[$objectType] as $RULE_TYPE => $RULE_VALUE) { foreach ($RULE_VALUE as $VALUE_CONFIG) { foreach ($VALUE_CONFIG['FIELDS'] as $VALUE_FIELDS) { $arConfigs[$RULE_TYPE][$VALUE_CONFIG['ID']][$VALUE_FIELDS['ID']]['DEFAULT'] = $VALUE_FIELDS['DEFAULT']; if (isset($arConfigs[$RULE_TYPE][$VALUE_CONFIG['ID']][$VALUE_FIELDS['ID']]['DEFAULT_INPUT'])) { $arConfigs[$RULE_TYPE][$VALUE_CONFIG['ID']][$VALUE_FIELDS['ID']]['DEFAULT_INPUT'] = $VALUE_FIELDS['DEFAULT_INPUT']; } } } } } return $arConfigs; } public static function voteCheck($arConfigs) { global $DB; $connection = \Bitrix\Main\Application::getConnection(); $helper = $connection->getSqlHelper(); $ratingId = CRatings::GetAuthorityRating(); if ($ratingId == 0) { return true; } // 1. UPDATE OLD VOTE (< 90 day) $strSql = " UPDATE b_rating_vote SET ACTIVE = 'N', USER_ID = 0 WHERE ENTITY_TYPE_ID = 'USER' and CREATED < " . $helper->addDaysToDateTime(-intval($arConfigs['CONDITION_CONFIG']['VOTE']['VOTE_LIMIT'])) . " "; $DB->Query($strSql); // 2. INSERT NEW VOTE FOR AUTHORITY $sRatingUser = ""; $sRatingWeightType = COption::GetOptionString("main", "rating_weight_type", "auto"); if ($sRatingWeightType == 'auto') { $sRatingAuthrorityWeight = COption::GetOptionString("main", "rating_authority_weight_formula", 'Y'); if ($sRatingAuthrorityWeight == 'Y') { $communitySize = COption::GetOptionString("main", "rating_community_size", 1); $communityAuthority = COption::GetOptionString("main", "rating_community_authority", 1); $voteWeight = COption::GetOptionString("main", "rating_vote_weight", 1); $sValue = "($communitySize*(RR.VOTE_WEIGHT/" . round($voteWeight, 4) . ")/" . round($communityAuthority) . ") as VALUE"; $ratingId = CRatings::GetAuthorityRating(); $sRatingUser = "LEFT JOIN b_rating_user RR ON RR.RATING_ID = " . intval($ratingId) . " AND RR.ENTITY_ID = RV.USER_ID"; } else { $sValue = "1 as VALUE"; } } else { $ratingId = CRatings::GetAuthorityRating(); $sRatingUser = "LEFT JOIN b_rating_user RR ON RR.RATING_ID = " . intval($ratingId) . " AND RR.ENTITY_ID = RV.USER_ID"; $sValue = "RR.VOTE_WEIGHT as VALUE"; } $strSql = " INSERT INTO b_rating_vote (RATING_VOTING_ID, VALUE, ACTIVE, CREATED, USER_ID, USER_IP, ENTITY_TYPE_ID, ENTITY_ID, OWNER_ID) SELECT 0 as RATING_VOTING_ID, $sValue, 'N' as ACTIVE, " . $DB->GetNowFunction() . " as CREATED, RV.USER_ID, 'auto' as USER_IP, 'USER' as ENTITY_TYPE_ID, RV.OWNER_ID as ENTITY_ID, RV.OWNER_ID FROM b_rating_vote RV $sRatingUser LEFT JOIN b_rating_vote RV2 ON RV2.USER_ID = RV.USER_ID AND RV2.ENTITY_TYPE_ID = 'USER' AND RV2.ENTITY_ID = RV.OWNER_ID WHERE RV.CREATED > " . $helper->addDaysToDateTime(-intval($arConfigs['CONDITION_CONFIG']['VOTE']['VOTE_LIMIT'])) . " and RV.VALUE > 0 and RV2.VALUE IS NULL and RV.OWNER_ID > 0 GROUP BY RV.USER_ID, RV.OWNER_ID HAVING SUM(case when RV.ENTITY_TYPE_ID = 'FORUM_TOPIC' then " . floatval($arConfigs['CONDITION_CONFIG']['VOTE']['VOTE_FORUM_TOPIC']) . " when RV.ENTITY_TYPE_ID = 'FORUM_POST' then " . floatval($arConfigs['CONDITION_CONFIG']['VOTE']['VOTE_FORUM_POST']) . " when RV.ENTITY_TYPE_ID = 'BLOG_POST' then " . floatval($arConfigs['CONDITION_CONFIG']['VOTE']['VOTE_BLOG_POST']) . " when RV.ENTITY_TYPE_ID = 'BLOG_COMMENT' then " . floatval($arConfigs['CONDITION_CONFIG']['VOTE']['VOTE_BLOG_COMMENT']) . " else 0 end) >= " . floatval($arConfigs['CONDITION_CONFIG']['VOTE']['VOTE_RESULT']) . " "; $DB->Query($strSql); // 3.INSERT NEW VOTING GROUP (FROM STEP 2) $strSql = " INSERT INTO b_rating_voting (ENTITY_TYPE_ID, ENTITY_ID, ACTIVE, CREATED, LAST_CALCULATED, TOTAL_VALUE, TOTAL_VOTES, TOTAL_POSITIVE_VOTES, TOTAL_NEGATIVE_VOTES, OWNER_ID) SELECT RV.ENTITY_TYPE_ID, RV.ENTITY_ID, 'Y' as ACTIVE, " . $DB->GetNowFunction() . " as CREATED, " . $DB->GetNowFunction() . " as LAST_CALCULATED, SUM(VALUE) as TOTAL_VALUE, SUM(1) as TOTAL_VOTES, SUM(case when RV.VALUE > '0' then 1 else 0 end) as TOTAL_POSITIVE_VOTES, SUM(case when RV.VALUE > '0' then 0 else 1 end) as TOTAL_NEGATIVE_VOTES, RV.ENTITY_ID as OWNER_ID FROM b_rating_vote RV LEFT JOIN b_rating_voting RVG ON RVG.ENTITY_TYPE_ID = RV.ENTITY_TYPE_ID AND RVG.ENTITY_ID = RV.ENTITY_ID WHERE RATING_VOTING_ID = 0 and RV.CREATED > " . $helper->addDaysToDateTime(-intval($arConfigs['CONDITION_CONFIG']['VOTE']['VOTE_LIMIT'])) . " and RVG.ID IS NULL and RV.OWNER_ID > 0 GROUP BY RV.ENTITY_TYPE_ID, RV.ENTITY_ID "; $DB->Query($strSql); // 4 UPDATE FIELD RATING_VOTE_ID (FROM STEP 3) $strSql = " UPDATE b_rating_vote RV, b_rating_voting RVG SET RV.RATING_VOTING_ID = RVG.ID, RV.ACTIVE = 'Y' WHERE RV.ENTITY_TYPE_ID = RVG.ENTITY_TYPE_ID and RV.ENTITY_ID = RVG.ENTITY_ID and RV.RATING_VOTING_ID = 0"; $DB->Query($strSql); // 5 INSERT TEMP TABLE VOTE RESULTS $DB->Query("TRUNCATE b_rating_voting_prepare"); $strSql = " INSERT INTO b_rating_voting_prepare (RATING_VOTING_ID, TOTAL_VALUE, TOTAL_VOTES, TOTAL_POSITIVE_VOTES, TOTAL_NEGATIVE_VOTES) SELECT RV.RATING_VOTING_ID, SUM(RV.VALUE) as TOTAL_VALUE, SUM(1) as TOTAL_VOTES, SUM(case when RV.VALUE > '0' then 1 else 0 end) as TOTAL_POSITIVE_VOTES, SUM(case when RV.VALUE > '0' then 0 else 1 end) as TOTAL_NEGATIVE_VOTES FROM b_rating_vote RV WHERE RV.RATING_VOTING_ID IN (SELECT DISTINCT RV0.RATING_VOTING_ID FROM b_rating_vote RV0 WHERE RV0.ACTIVE='N') and RV.USER_ID > 0 GROUP BY RV.RATING_VOTING_ID"; $DB->Query($strSql); // 6 UPDATE VOTE_RESULTS FROM TEMP TABLE $strSql = " UPDATE b_rating_voting RVG, b_rating_voting_prepare RVG0 SET RVG.TOTAL_VALUE = RVG0.TOTAL_VALUE, RVG.TOTAL_VOTES = RVG0.TOTAL_VOTES, RVG.TOTAL_POSITIVE_VOTES = RVG0.TOTAL_POSITIVE_VOTES, RVG.TOTAL_NEGATIVE_VOTES = RVG0.TOTAL_NEGATIVE_VOTES WHERE RVG.ID = RVG0.RATING_VOTING_ID"; $DB->Query($strSql); // 7 DELETE OLD POST $strSql = "DELETE FROM b_rating_vote WHERE ENTITY_TYPE_ID = 'USER' and CREATED < " . $helper->addDaysToDateTime(-intval($arConfigs['CONDITION_CONFIG']['VOTE']['VOTE_LIMIT'])) . ""; $DB->Query($strSql); return true; } }