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;
}