static function GetList($params = Array())
{
if (!is_array($params))
$params = Array();
$userIds = Array();
if (isset($params['ID']) && is_array($params['ID']) && !empty($params['ID']))
{
foreach ($params['ID'] as $key => $value)
{
$userIds[] = intval($value);
}
}
else if (isset($params['ID']) && intval($params['ID']) > 0)
{
$userIds[] = intval($params['ID']);
}
if (isset($params['CLEAR_CACHE']) && $params['CLEAR_CACHE'] == 'Y')
{
$obCache = new CPHPCache();
$obCache->CleanDir(self::CACHE_ONLINE_PATH);
}
global $USER;
$userId = is_object($USER)? intval($USER->GetID()): 0;
$users = Array();
$loadFromDb = true;
$loadRecent = false;
if (empty($userIds))
{
$loadRecent = true;
if (!is_null(self::$CACHE_RECENT))
{
$loadFromDb = false;
$users = self::$CACHE_RECENT;
}
}
else if (!empty($userIds))
{
foreach($userIds as $id => $uid)
{
if (isset(self::$CACHE_USERS[$uid]))
{
unset($userIds[$id]);
$users[$uid] = self::$CACHE_USERS[$uid];
}
}
if (empty($userIds))
{
$loadFromDb = false;
}
}
if ($loadFromDb)
{
if ($loadRecent)
{
$orm = BitrixImModelRecentTable::getList(array(
'select' => Array(
'ID' => 'U.ID',
'EXTERNAL_AUTH_ID' => 'U.EXTERNAL_AUTH_ID',
'LAST_ACTIVITY_DATE' => 'U.LAST_ACTIVITY_DATE',
'PERSONAL_GENDER' => 'U.PERSONAL_GENDER',
'COLOR' => 'ST.COLOR',
'STATUS' => 'ST.STATUS',
'IDLE' => 'ST.IDLE',
'MOBILE_LAST_DATE' => 'ST.MOBILE_LAST_DATE',
'DESKTOP_LAST_DATE' => 'ST.DESKTOP_LAST_DATE',
),
'runtime' => Array(
new BitrixMainEntityReferenceField(
'ST',
'BitrixImModelStatusTable',
array("=ref.USER_ID" => "this.ITEM_ID",),
array("join_type"=>"LEFT")
),
new BitrixMainEntityReferenceField(
'U',
'BitrixMainUserTable',
array("=ref.ID" => "this.ITEM_ID",),
array("join_type"=>"LEFT")
)
),
'filter' => Array(
'=USER_ID' => $userId,
"=ITEM_TYPE" => IM_MESSAGE_PRIVATE,
)
));
}
else
{
$orm = BitrixMainUserTable::getList(array(
'select' => Array(
'ID',
'EXTERNAL_AUTH_ID',
'LAST_ACTIVITY_DATE',
'PERSONAL_GENDER',
'COLOR' => 'ST.COLOR',
'STATUS' => 'ST.STATUS',
'IDLE' => 'ST.IDLE',
'MOBILE_LAST_DATE' => 'ST.MOBILE_LAST_DATE',
'DESKTOP_LAST_DATE' => 'ST.DESKTOP_LAST_DATE',
),
'runtime' => Array(
new BitrixMainEntityReferenceField(
'ST',
'BitrixImModelStatusTable',
array(
"=ref.USER_ID" => "this.ID",
),
array("join_type"=>"LEFT")
)
),
'filter' => Array(
'=ID' => $userIds,
)
));
}
while ($user = $orm->fetch())
{
$color = null;
if (isset($user['COLOR']) && $user['COLOR'] <> '')
{
$color = IMColor::getColor($user['COLOR']);
}
if (!$color)
{
$color = CIMContactList::GetUserColor($user["ID"], $user['PERSONAL_GENDER'] == 'M'? 'M': 'F');
}
$user['LAST_ACTIVITY_DATE'] = $user['LAST_ACTIVITY_DATE'] instanceof BitrixMainTypeDateTime? $user['LAST_ACTIVITY_DATE']: false;
$user = CIMStatus::prepareLastDate($user);
$users[$user["ID"]] = Array(
'id' => $user["ID"],
'status' => in_array($user['STATUS'], self::$AVAILABLE_STATUSES)? $user['STATUS']: 'online',
'color' => $color,
'idle' => $user['IDLE']?: false,
'last_activity_date' => $user['LAST_ACTIVITY_DATE']?: false,
'mobile_last_date' => $user['MOBILE_LAST_DATE']?: false,
'absent' => CIMContactList::formatAbsentResult($user["ID"]),
);
self::$CACHE_USERS[$user["ID"]] = $users[$user["ID"]];
}
if ($loadRecent)
{
self::$CACHE_RECENT = self::$CACHE_USERS;
}
}
return Array('users' => $users);
}