• Модуль: im
  • Путь к файлу: ~/bitrix/modules/im/lib/user.php
  • Класс: BitrixImUser
  • Вызов: User::getList
static function getList($params)
{
	$params = is_array($params)? $params: Array();

	if (!isset($params['CURRENT_USER']) && is_object($GLOBALS['USER']))
	{
		$params['CURRENT_USER'] = $GLOBALS['USER']->GetID();
	}

	$params['CURRENT_USER'] = intval($params['CURRENT_USER']);

	$userId = $params['CURRENT_USER'];
	if ($userId <= 0)
	{
		return false;
	}

	$enableLimit = false;
	if (isset($params['OFFSET']))
	{
		$filterLimit = intval($params['LIMIT']);
		$filterLimit = $filterLimit <= 0? self::FILTER_LIMIT: $filterLimit;

		$filterOffset = intval($params['OFFSET']);

		$enableLimit = true;
	}
	else
	{
		$filterLimit = false;
		$filterOffset = false;
	}

	$ormParams = self::getListParams($params);
	if (is_null($ormParams))
	{
		return false;
	}

	$filter = $ormParams['filter'];
	$filter['ACTIVE'] = 'Y';

	$intranetInstalled = BitrixMainLoader::includeModule('intranet');
	$voximplantInstalled = BitrixMainLoader::includeModule('voximplant');

	$select = array(
		"ID", "LAST_NAME", "NAME", "LOGIN", "PERSONAL_PHOTO", "SECOND_NAME", "PERSONAL_BIRTHDAY", "WORK_POSITION", "PERSONAL_GENDER", "EXTERNAL_AUTH_ID", "WORK_PHONE", "PERSONAL_PHONE", "PERSONAL_MOBILE", "TIME_ZONE_OFFSET", "ACTIVE", "LAST_ACTIVITY_DATE",
		"COLOR" => "ST.COLOR", "STATUS" =>	"ST.STATUS", "IDLE" => "ST.IDLE", "MOBILE_LAST_DATE" => "ST.MOBILE_LAST_DATE",
	);
	if($intranetInstalled)
	{
		$select[] = 'UF_PHONE_INNER';
		$select[] = 'UF_DEPARTMENT';
	}
	if ($voximplantInstalled)
	{
		$select[] = 'UF_VI_PHONE';
	}

	$ormParams = Array(
		'select' => $select,
		'filter' => $filter,
		'runtime' => Array(
			new BitrixMainEntityReferenceField(
				'ST',
				'BitrixImModelStatusTable',
				array(
					"=ref.USER_ID" => "this.ID",
				),
				array("join_type"=>"LEFT")
			)
		),
	);
	if ($enableLimit)
	{
		$ormParams['offset'] = $filterOffset;
		$ormParams['limit'] = $filterLimit;
	}

	$orm = BitrixMainUserTable::getList($ormParams);
	$bots = BitrixImBot::getListCache();

	$users = array();
	while ($user = $orm->fetch())
	{
		if (CIMContactList::IsExtranet($user))
		{
			continue;
		}

		$color = false;
		if (isset($user['COLOR']) && $user['COLOR'] <> '')
		{
			$color = BitrixImColor::getColor($user['COLOR']);
		}
		if (!$color)
		{
			$color = CIMContactList::GetUserColor($user["ID"], $user['PERSONAL_GENDER'] == 'M'? 'M': 'F');
		}

		$users[$user["ID"]] = Array(
			'ID' => (int)$user["ID"],
			'NAME' => BitrixImUser::formatFullNameFromDatabase($user),
			'FIRST_NAME' => BitrixImUser::formatNameFromDatabase($user),
			'LAST_NAME' => $user['LAST_NAME'],
			'WORK_POSITION' => $user['WORK_POSITION'],
			'COLOR' => $color,
			'AVATAR' => CIMChat::GetAvatarImage($user["PERSONAL_PHOTO"], 200, false),
			'GENDER' => $user['PERSONAL_GENDER'] == 'F'? 'F': 'M',
			'BIRTHDAY' => $user['PERSONAL_BIRTHDAY'] instanceof BitrixMainTypeDate? $user['PERSONAL_BIRTHDAY']->format('d-m'): false,
			'EXTRANET' => CIMContactList::IsExtranet($user),
			'NETWORK' => $user['EXTERNAL_AUTH_ID'] == CIMContactList::NETWORK_AUTH_ID || $user['EXTERNAL_AUTH_ID'] == BitrixImBot::EXTERNAL_AUTH_ID && $bots[$user["ID"]]['TYPE'] == BitrixImBot::TYPE_NETWORK,
			'BOT' => $user['EXTERNAL_AUTH_ID'] == BitrixImBot::EXTERNAL_AUTH_ID,
			'CONNECTOR' => $user['EXTERNAL_AUTH_ID'] == "imconnector",
			'EXTERNAL_AUTH_ID' => $user['EXTERNAL_AUTH_ID']? $user['EXTERNAL_AUTH_ID']: 'default',
			'STATUS' => $user['STATUS'],
			'IDLE' => $user['IDLE'] instanceof BitrixMainTypeDateTime? $user['IDLE']: false,
			'LAST_ACTIVITY_DATE' => $user['MOBILE_LAST_DATE'] instanceof BitrixMainTypeDateTime? $user['MOBILE_LAST_DATE']: false,
			'MOBILE_LAST_DATE' => $user['LAST_ACTIVITY_DATE'] instanceof BitrixMainTypeDateTime? $user['LAST_ACTIVITY_DATE']: false,
			'DEPARTMENTS' => is_array($user['UF_DEPARTMENT']) && !empty($user['UF_DEPARTMENT'])? $user['UF_DEPARTMENT']: [],
			'ABSENT' => CIMContactList::formatAbsentResult($user["ID"]),
		);
		if ($params['HR_PHOTO'])
		{
			$users[$user["ID"]]['AVATAR_HR'] = $users[$user["ID"]]['avatar'];
		}

		if ($voximplantInstalled)
		{
			$user["WORK_PHONE"] = CVoxImplantPhone::Normalize($user["WORK_PHONE"]);
			if ($user["WORK_PHONE"])
			{
				$users[$user["ID"]]['PHONES']['WORK_PHONE'] = $user['WORK_PHONE'];
			}
			$user["PERSONAL_MOBILE"] = CVoxImplantPhone::Normalize($user["PERSONAL_MOBILE"]);
			if ($user["PERSONAL_MOBILE"])
			{
				$users[$user["ID"]]['PHONES']['PERSONAL_MOBILE'] = $user['PERSONAL_MOBILE'];
			}
			$user["PERSONAL_PHONE"] = CVoxImplantPhone::Normalize($user["PERSONAL_PHONE"]);
			if ($user["PERSONAL_PHONE"])
			{
				$users[$user["ID"]]['PHONES']['PERSONAL_PHONE'] = $user['PERSONAL_PHONE'];
			}
			$user["UF_PHONE_INNER"] = preg_replace("/[^0-9#*]/i", "", $user["UF_PHONE_INNER"]);
			if ($user["UF_PHONE_INNER"])
			{
				$users[$user["ID"]]['PHONES']['INNER_PHONE'] = $user["UF_PHONE_INNER"];
			}
		}
		else
		{
			$users[$user["ID"]]['PHONES']['WORK_PHONE'] = $user['WORK_PHONE'];
			$users[$user["ID"]]['PHONES']['PERSONAL_MOBILE'] = $user['PERSONAL_MOBILE'];
			$users[$user["ID"]]['PHONES']['PERSONAL_PHONE'] = $user['PERSONAL_PHONE'];
			$users[$user["ID"]]['PHONES']['INNER_PHONE'] = $user["UF_PHONE_INNER"];
		}
	}

	if ($params['JSON'])
	{
		foreach ($users as $key => $userData)
		{
			foreach ($userData as $field => $value)
			{
				if ($value instanceof BitrixMainTypeDateTime)
				{
					$users[$key][$field] = date('c', $value->getTimestamp());
				}
				else if (is_string($value) && $value && is_string($field) &&  in_array($field, Array('AVATAR', 'AVATAR_HR')) && mb_strpos($value, 'http') !== 0)
				{
					$users[$key][$field] = BitrixImCommon::getPublicDomain().$value;
				}
				else if (is_array($value))
				{
					$users[$key][$field] = array_change_key_case($value, CASE_LOWER);
				}
			}
			$users[$key] = array_change_key_case($users[$key], CASE_LOWER);;
		}
	}

	return $users;
}