• Модуль: socialnetwork
  • Путь к файлу: ~/bitrix/modules/socialnetwork/lib/componenthelper.php
  • Класс: BitrixSocialnetworkComponentHelper
  • Вызов: ComponentHelper::getLivefeedRatingData
static function getLivefeedRatingData($params = [])
{
	global $USER;

	$result = [];

	$logIdList = (
		!empty($params['logId'])
			? $params['logId']
			: []
	);

	if (!is_array($logIdList))
	{
		$logIdList = [ $logIdList ];
	}

	if (empty($logIdList))
	{
		return $result;
	}

	$ratingId = CRatings::getAuthorityRating();
	if ((int)$ratingId <= 0)
	{
		return $result;
	}

	$result = array_fill_keys($logIdList, []);

	$topCount = (
		isset($params['topCount'])
			? (int)$params['topCount']
			: 0
	);

	if ($topCount <= 0)
	{
		$topCount = 2;
	}

	if ($topCount > 5)
	{
		$topCount = 5;
	}

	$avatarSize = (
		isset($params['avatarSize'])
			? (int)$params['avatarSize']
			: 100
	);

	$connection = Application::getConnection();
	$connection->queryExecute('SET @user_rank = 0');
	$connection->queryExecute('SET @current_log_id = 0');

	if (ModuleManager::isModuleInstalled('intranet'))
	{
		$res = $connection->query('SELECT /*+ NO_DERIVED_CONDITION_PUSHDOWN() */
			@user_rank := IF(
				@current_log_id = tmp.LOG_ID,
				@user_rank + 1,
				1
			) as USER_RANK,
			@current_log_id := tmp.LOG_ID,
			tmp.USER_ID as USER_ID,
			tmp.LOG_ID as LOG_ID,
			tmp.WEIGHT as WEIGHT
		FROM (
			SELECT /*+ NO_DERIVED_CONDITION_PUSHDOWN() */
				@rownum := @rownum + 1 as ROWNUM,
				RS1.ENTITY_ID as USER_ID,
				SL.ID as LOG_ID,
				MAX(RS1.VOTES) as WEIGHT
			FROM
				b_rating_subordinate RS1,
				b_rating_vote RV1
			INNER JOIN b_sonet_log SL
				ON SL.RATING_TYPE_ID = RV1.ENTITY_TYPE_ID
				AND SL.RATING_ENTITY_ID = RV1.ENTITY_ID
				AND SL.ID IN ('.implode(',', $logIdList).')
			WHERE
				RS1.ENTITY_ID = RV1.USER_ID
				AND RS1.RATING_ID = '.(int)$ratingId.'
			GROUP BY
				SL.ID, RS1.ENTITY_ID
			ORDER BY
				SL.ID,
				WEIGHT DESC
		) tmp');
	}
	else
	{
		$res = $connection->query('SELECT /*+ NO_DERIVED_CONDITION_PUSHDOWN() */
			@user_rank := IF(
				@current_log_id = tmp.LOG_ID,
				@user_rank + 1,
				1
			) as USER_RANK,
			@current_log_id := tmp.LOG_ID,
			tmp.USER_ID as USER_ID,
			tmp.LOG_ID as LOG_ID,
			tmp.WEIGHT as WEIGHT
		FROM (
			SELECT /*+ NO_DERIVED_CONDITION_PUSHDOWN() */
				@rownum := @rownum + 1 as ROWNUM,
				RV1.USER_ID as USER_ID,
				SL.ID as LOG_ID,
				RV1.VALUE as WEIGHT
			FROM
				b_rating_vote RV1
			INNER JOIN b_sonet_log SL
				ON SL.RATING_TYPE_ID = RV1.ENTITY_TYPE_ID
				AND SL.RATING_ENTITY_ID = RV1.ENTITY_ID
				AND SL.ID IN ('.implode(',', $logIdList).')
			ORDER BY
				SL.ID,
				WEIGHT DESC
		) tmp');
	}

	$userWeightData = [];
	$logUserData = [];

	$currentLogId = 0;
	$hasMine = false;
	$cnt = 0;

	while ($voteFields = $res->fetch())
	{
		$voteUserId = (int)$voteFields['USER_ID'];
		$voteLogId = (int)$voteFields['LOG_ID'];

		if (
			!$hasMine
			&& $voteUserId === (int)$USER->getId()
		)
		{
			$hasMine = true;
		}

		if ($voteLogId !== $currentLogId)
		{
			$cnt = 0;
			$hasMine = false;
			$logUserData[$voteLogId] = [];
		}

		$currentLogId = $voteLogId;

		if (in_array($voteUserId, $logUserData[$voteLogId], true))
		{
			continue;
		}

		$cnt++;

		if ($cnt > ($hasMine ? $topCount+1 : $topCount))
		{
			continue;
		}

		$logUserData[$voteLogId][] = $voteUserId;
		if (!isset($userWeightData[$voteUserId]))
		{
			$userWeightData[$voteUserId] = (float)$voteFields['WEIGHT'];
		}
	}

	$userData = [];

	if (!empty($userWeightData))
	{
		$res = MainUserTable::getList([
			'filter' => [
				'@ID' => array_keys($userWeightData)
			],
			'select' => [ 'ID', 'NAME', 'LAST_NAME', 'SECOND_NAME', 'LOGIN', 'PERSONAL_PHOTO', 'PERSONAL_GENDER' ]
		]);

		while ($userFields = $res->fetch())
		{
			$userData[$userFields["ID"]] = [
				'NAME_FORMATTED' => CUser::formatName(
					CSite::getNameFormat(false),
					$userFields,
					true
				),
				'PERSONAL_PHOTO' => [
					'ID' => $userFields['PERSONAL_PHOTO'],
					'SRC' => false
				],
				'PERSONAL_GENDER' => $userFields['PERSONAL_GENDER']
			];

			if ((int)$userFields['PERSONAL_PHOTO'] > 0)
			{
				$imageFile = CFile::getFileArray($userFields["PERSONAL_PHOTO"]);
				if ($imageFile !== false)
				{
					$file = CFile::resizeImageGet(
						$imageFile,
						[
							'width' => $avatarSize,
							'height' => $avatarSize,
						],
						BX_RESIZE_IMAGE_EXACT,
						false
					);
					$userData[$userFields["ID"]]['PERSONAL_PHOTO']['SRC'] = $file['src'];
				}
			}
		}
	}

	foreach ($logUserData as $logId => $userIdList)
	{
		$result[$logId] = [];

		foreach ($userIdList as $userId)
		{
			$result[$logId][] = [
				'ID' => $userId,
				'NAME_FORMATTED' => $userData[$userId]['NAME_FORMATTED'],
				'PERSONAL_PHOTO' => $userData[$userId]['PERSONAL_PHOTO']['ID'],
				'PERSONAL_PHOTO_SRC' => $userData[$userId]['PERSONAL_PHOTO']['SRC'],
				'PERSONAL_GENDER' => $userData[$userId]['PERSONAL_GENDER'],
				'WEIGHT' => $userWeightData[$userId]
			];
		}
	}

	foreach ($result as $logId => $data)
	{
		usort(
			$data,
			static function($a, $b)
			{
				if (
					!isset($a['WEIGHT'], $b['WEIGHT'])
					|| $a['WEIGHT'] === $b['WEIGHT']
				)
				{
					return 0;
				}
				return ($a['WEIGHT'] > $b['WEIGHT']) ? -1 : 1;
			}
		);
		$result[$logId] = $data;
	}

	return $result;
}