• Модуль: main
  • Путь к файлу: ~/bitrix/modules/main/lib/controller/rating.php
  • Класс: BitrixMainControllerRating
  • Вызов: Rating::voteAction
public function voteAction(array $params = []): ?array
{
	$signedKey = (string) ($params['RATING_VOTE_KEY_SIGNED'] ?? '');
	$entityId = (int) ($params['RATING_VOTE_ENTITY_ID'] ?? 0);
	$entityTypeId = (string) ($params['RATING_VOTE_TYPE_ID'] ?? '');

	$payloadValue = $entityTypeId . '-' . $entityId;

	$signer = new BitrixMainSecuritySignTimeSigner();
	if (
		$signedKey === ''
		|| $signer->unsign($signedKey, 'main.rating.vote') !== $payloadValue
	)
	{
		$this->addError(new MainError('Access denied'));

		return null;
	}

	$key = self::LOCK_KEY_PREFIX.$this->getCurrentUser()->getId();

	if (!Application::getConnection()->lock($key))
	{
		$this->addError(new MainError('Request already exists', 'ERR_PARAMS'));
		return null;
	}

	$action = (string)($params['RATING_VOTE_ACTION'] ?? '');
	$reaction = (string)($params['RATING_VOTE_REACTION'] ?? '');

	if (
		$entityTypeId === ''
		|| $entityId <= 0
	)
	{
		$this->addError(new MainError('Incorrect data', 'ERR_PARAMS'));
		return null;
	}

	$ratingParams = [
		'ENTITY_TYPE_ID' => $entityTypeId,
		'ENTITY_ID' => $entityId,
		'ACTION' => (in_array($action, [ 'plus', 'minus', 'change', 'cancel' ]) ? $action : 'list'),
		'REACTION' => $reaction,
		'RATING_RESULT' => 'N',
		'REMOTE_ADDR' => $_SERVER['REMOTE_ADDR'],
		'CURRENT_USER_ID' => $this->getCurrentUser()->getId(),
		'CHECK_RIGHTS' => 'Y',
	];

	$ratingVoteResult = CRatings::getRatingVoteResult($ratingParams['ENTITY_TYPE_ID'], $ratingParams['ENTITY_ID']);
	if (!empty($ratingVoteResult))
	{
		$ratingParams['TOTAL_VALUE'] = $ratingVoteResult['TOTAL_VALUE'];
		$ratingParams['TOTAL_VOTES'] = $ratingVoteResult['TOTAL_VOTES'];
		$ratingParams['TOTAL_POSITIVE_VOTES'] = $ratingVoteResult['TOTAL_POSITIVE_VOTES'];
		$ratingParams['TOTAL_NEGATIVE_VOTES'] = $ratingVoteResult['TOTAL_NEGATIVE_VOTES'];
		$ratingParams['USER_HAS_VOTED'] = $ratingVoteResult['USER_HAS_VOTED'];
		$ratingParams['USER_VOTE'] = $ratingVoteResult['USER_VOTE'];
	}
	else
	{
		$ratingParams['TOTAL_VALUE'] = 0;
		$ratingParams['TOTAL_VOTES'] = 0;
		$ratingParams['TOTAL_POSITIVE_VOTES'] = 0;
		$ratingParams['TOTAL_NEGATIVE_VOTES'] = 0;
		$ratingParams['USER_HAS_VOTED'] = 'N';
		$ratingParams['USER_VOTE'] = '0';
	}

	$voteList = Action::vote($ratingParams);
	if (empty($voteList))
	{
		$this->addError(new MainError('Cannot do vote', 'CANNOT_VOTE'));
	}

	Application::getConnection()->unlock($key);

	return $voteList;
}