• Модуль: main
  • Путь к файлу: ~/bitrix/modules/main/classes/general/ratings.php
  • Класс: CAllRatings
  • Вызов: CAllRatings::CancelRatingVote
static function CancelRatingVote($arParam)
{
	global $DB, $CACHE_MANAGER;
	$connection = BitrixMainApplication::getConnection();
	$helper = $connection->getSqlHelper();

	$err_mess = (CRatings::err_mess())."
Function: CancelRatingVote
Line: "; $sqlStr = " SELECT RVG.ID, RV.ID AS VOTE_ID, RV.REACTION AS REACTION, RV.VALUE AS VOTE_VALUE, RVG.TOTAL_POSITIVE_VOTES FROM b_rating_voting RVG, b_rating_vote RV WHERE RVG.ENTITY_TYPE_ID = '".$DB->ForSql($arParam['ENTITY_TYPE_ID'])."' and RVG.ENTITY_ID = ".(int)$arParam['ENTITY_ID']." and RVG.ID = RV.RATING_VOTING_ID and RV.USER_ID = ".(int)$arParam['USER_ID']; $res = $DB->Query($sqlStr, false, $err_mess.__LINE__); if ($arVote = $res->Fetch()) { $votePlus = $arVote['VOTE_VALUE'] >= 0 ? true : false; $arVote['REACTION'] = ($arVote['REACTION'] <> '' ? $arVote['REACTION'] : self::REACTION_DEFAULT); if ($votePlus) { $rsRVR = $DB->Query("SELECT TOTAL_VOTES FROM b_rating_voting_reaction WHERE ENTITY_TYPE_ID='".$DB->ForSql($arParam['ENTITY_TYPE_ID'])."' AND ENTITY_ID='".(int)$arParam['ENTITY_ID']."'", false, $err_mess.__LINE__); if (!($arRVR = $rsRVR->fetch())) // reactions not initialized { $merge = $helper->prepareMerge('b_rating_voting_reaction', ['ENTITY_TYPE_ID', 'ENTITY_ID', 'REACTION'], [ 'ENTITY_TYPE_ID' => $arParam['ENTITY_TYPE_ID'], 'ENTITY_ID' => $arParam['ENTITY_ID'], 'REACTION' => self::REACTION_DEFAULT, 'TOTAL_VOTES' => $arVote['TOTAL_POSITIVE_VOTES'], ], [ 'TOTAL_VOTES' => $arVote['TOTAL_POSITIVE_VOTES'], ]); if ($merge[0]) { $DB->query($merge[0]); } } } $arFields = array( 'TOTAL_VOTES' => "TOTAL_VOTES-1", 'TOTAL_VALUE' => "TOTAL_VALUE".($votePlus ? '-'.(float)$arVote['VOTE_VALUE'] : '+'.(float)(-1 * $arVote['VOTE_VALUE'])), 'LAST_CALCULATED' => $DB->GetNowFunction(), ); $arFields[($votePlus ? 'TOTAL_POSITIVE_VOTES' : 'TOTAL_NEGATIVE_VOTES')] = ($votePlus ? 'TOTAL_POSITIVE_VOTES-1' : 'TOTAL_NEGATIVE_VOTES-1'); $DB->Update("b_rating_voting", $arFields, "WHERE ID=".(int)$arVote['ID'], $err_mess.__LINE__); if ($votePlus) { $merge = $helper->prepareMerge('b_rating_voting_reaction', ['ENTITY_TYPE_ID', 'ENTITY_ID', 'REACTION'], [ 'ENTITY_TYPE_ID' => $arParam['ENTITY_TYPE_ID'], 'ENTITY_ID' => $arParam['ENTITY_ID'], 'REACTION' => $arVote['REACTION'], 'TOTAL_VOTES' => 0, ], [ 'TOTAL_VOTES' => new BitrixMainDBSqlExpression('b_rating_voting_reaction.TOTAL_VOTES - 1'), ]); if ($merge[0]) { $DB->query($merge[0]); } } $DB->Query("DELETE FROM b_rating_vote WHERE ID=".(int)$arVote['VOTE_ID'], false, $err_mess.__LINE__); $arParam['REACTIONS_LIST'] = array(); $rsRVR = $DB->Query("SELECT REACTION, TOTAL_VOTES FROM b_rating_voting_reaction WHERE ENTITY_TYPE_ID='".$DB->ForSql($arParam['ENTITY_TYPE_ID'])."' AND ENTITY_ID='".(int)$arParam['ENTITY_ID']."'", false, $err_mess.__LINE__); while($arRVR = $rsRVR->fetch()) { $arParam['REACTIONS_LIST'][$arRVR['REACTION']] = $arRVR['TOTAL_VOTES']; } foreach(GetModuleEvents("main", "OnCancelRatingVote", true) as $arEvent) ExecuteModuleEventEx($arEvent, array((int)$arVote['VOTE_ID'], $arParam)); $userData = CAllRatings::getUserData((int)$arParam['USER_ID'], (float)$arVote['VOTE_VALUE']); if (CModule::IncludeModule('pull')) { CPullStack::AddShared(Array( 'module_id' => 'main', 'command' => 'rating_vote', 'params' => Array( "TYPE" => "CANCEL", "USER_ID" => (int)$arParam['USER_ID'], "ENTITY_TYPE_ID" => $arParam["ENTITY_TYPE_ID"], "ENTITY_ID" => (int)$arParam['ENTITY_ID'], "TOTAL_POSITIVE_VOTES" => (int)($arVote['TOTAL_POSITIVE_VOTES'] + ($votePlus ? -1 : 1)), "RESULT" => $votePlus? 'PLUS': 'MINUS', "USER_DATA" => $userData, "REACTION" => $arVote['REACTION'], "REACTIONS_LIST" => $arParam['REACTIONS_LIST'] ) )); } if (CACHED_b_rating_vote!==false) { $bucket_size = (int)CACHED_b_rating_bucket_size; if($bucket_size <= 0) $bucket_size = 100; $bucket = (int)((int)$arParam['ENTITY_ID'] / $bucket_size); $CACHE_MANAGER->Clean("b_rvg_".$DB->ForSql($arParam["ENTITY_TYPE_ID"]).$bucket, "b_rating_voting"); } return $userData; } return false; }