• Модуль: im
  • Путь к файлу: ~/bitrix/modules/im/classes/general/im_contact_list.php
  • Класс: CAllIMContactList
  • Вызов: CAllIMContactList::GetUserData
static function GetUserData($arParams = Array())
{
	$paramsDepartment = $arParams['DEPARTMENT'] ?? null;
	$paramsHrPhoto = $arParams['HR_PHOTO'] ?? null;
	$paramsPhones = $arParams['PHONES'] ?? null;
	$paramsUseCache = $arParams['USE_CACHE'] ?? null;
	$paramsShowOnline = $arParams['SHOW_ONLINE'] ?? null;
	$paramsExtraFields = $arParams['EXTRA_FIELDS'] ?? null;
	$paramsCacheTtl = $arParams['CACHE_TTL'] ?? null;

	$getDepartment = !($paramsDepartment === 'N');
	$getHrPhoto = $paramsHrPhoto === 'Y';
	$getPhones = $paramsPhones === 'Y' && IsModuleInstalled('intranet');
	$useCache = !($paramsUseCache === 'N');
	$showOnline = !($paramsShowOnline === 'N');
	$extraFields = $paramsExtraFields === 'Y';

	$arFilter = Array();
	if (isset($arParams['ID']) && is_array($arParams['ID']) && !empty($arParams['ID']))
	{
		foreach ($arParams['ID'] as $key => $value)
		{
			if (intval($value) > 0)
			{
				$arParams['ID'][$key] = intval($value);
			}
		}
		$arFilter['=ID'] = $arParams['ID'];
	}
	else if (isset($arParams['ID']) && intval($arParams['ID']) > 0)
	{
		$arFilter['=ID'] = Array(intval($arParams['ID']));
	}

	if (empty($arFilter))
		return false;

	$nameTemplate = self::GetUserNameTemplate(SITE_ID);
	$nameTemplateSite = CSite::GetNameFormat(false);

	$bIntranetEnable = false;
	if(IsModuleInstalled('intranet') && CModule::IncludeModule('intranet'))
		$bIntranetEnable = true;

	$bVoximplantEnable = IsModuleInstalled('voximplant');
	$bColorEnabled = IMColor::isEnabled();

	if ($useCache)
	{
		$obCache = new CPHPCache;
		$cache_ttl = (int)$paramsCacheTtl;
		if ($cache_ttl <= 0)
		{
			$cache_ttl = defined("BX_COMP_MANAGED_CACHE") ? 18144000 : 1800;
		}

		$uid = md5(implode('|', $arFilter['=ID']));
		$cache_id = 'user_data_v39_'.$uid.'_'.$nameTemplate.'_'.$nameTemplateSite.'_'.$extraFields.'_'.$getPhones.'_'.$getDepartment.'_'.$bIntranetEnable.'_'.$bVoximplantEnable.'_'.LANGUAGE_ID.'_'.$bColorEnabled;
		$cache_dir = '/bx/imc/userdata/' . mb_substr($uid, 0, 2) . '/' . mb_substr($uid, 2, 2) . '/' . $uid;
		if ($obCache->initCache($cache_ttl, $cache_id, $cache_dir))
		{
			$arCacheResult = $obCache->getVars();
			if ($showOnline)
			{
				$onlineUserId = array_keys(array_filter($arCacheResult['users'], function($user) {
					return !$user['bot'];
				}));
				if (!empty($onlineUserId))
				{
					$arOnline = CIMStatus::GetList(Array('ID' => $onlineUserId));
				}
			}

			foreach ($arCacheResult['users'] as $userId => $value)
			{
				if ($showOnline)
				{
					$arCacheResult['users'][$userId]['status'] = isset($arOnline['users'][$userId])? $arOnline['users'][$userId]['status']: 'offline';
					$arCacheResult['users'][$userId]['idle'] = isset($arOnline['users'][$userId])? $arOnline['users'][$userId]['idle']: false;
					$arCacheResult['users'][$userId]['mobile_last_date'] = isset($arOnline['users'][$userId])? $arOnline['users'][$userId]['mobile_last_date']: false;
					$arCacheResult['users'][$userId]['desktop_last_date'] = $arOnline['users'][$userId]['desktop_last_date'] ?? false;
					$arCacheResult['users'][$userId]['last_activity_date'] = isset($arOnline['users'][$userId])? $arOnline['users'][$userId]['last_activity_date']: false;
					$arCacheResult['users'][$userId]['absent'] = isset($arOnline['users'][$userId])? $arOnline['users'][$userId]['absent']: false;
				}

				if ($getHrPhoto && !isset($arCacheResult['hrphoto']))
				{
					$arCacheResult['hrphoto'][$userId] = $arCacheResult['users'][$userId]['avatar'];
				}
			}
			return $arCacheResult;
		}
	}

	$arSelect = array("ID", "LAST_NAME", "NAME", "EMAIL", "LOGIN", "PERSONAL_PHOTO", "SECOND_NAME", "PERSONAL_BIRTHDAY", "WORK_POSITION", "PERSONAL_GENDER", "EXTERNAL_AUTH_ID", "TIME_ZONE_OFFSET", "PERSONAL_WWW", "ACTIVE", "LAST_ACTIVITY_DATE"); // TODO , "TIME_ZONE_OFFSET"
	if ($getPhones)
	{
		$arSelect[] = 'WORK_PHONE';
		$arSelect[] = 'PERSONAL_PHONE';
		$arSelect[] = 'PERSONAL_MOBILE';
	}
	if($bIntranetEnable)
	{
		$arSelect[] = 'UF_ZOOM';
		$arSelect[] = 'UF_SKYPE';
		$arSelect[] = 'UF_SKYPE_LINK';
		$arSelect[] = 'UF_PHONE_INNER';
		$arSelect[] = 'UF_DEPARTMENT';
	}
	if ($bVoximplantEnable)
	{
		$arSelect[] = 'UF_VI_PHONE';
	}

	$arUsers = array();
	$arUserInGroup = array();
	$arPhones = array();
	$arHrPhoto = array();
	$arSource = array();

	$query = new BitrixMainEntityQuery(BitrixMainUserTable::getEntity());

	$query->registerRuntimeField('', new BitrixMainEntityReferenceField('ref', 'BitrixImModelStatusTable', array('=this.ID' => 'ref.USER_ID')));
	$query->addSelect('ref.COLOR', 'COLOR')
		->addSelect('ref.STATUS', 'STATUS')
		->addSelect('ref.IDLE', 'IDLE')
		->addSelect('ref.MOBILE_LAST_DATE', 'MOBILE_LAST_DATE')
		->addSelect('ref.DESKTOP_LAST_DATE', 'DESKTOP_LAST_DATE');

	foreach ($arSelect as $value)
	{
		$query->addSelect($value);
	}
	foreach ($arFilter as $key => $value)
	{
		$query->addFilter($key, $value);
	}
	$resultQuery = $query->exec();

	$bots = BitrixImBot::getListCache();

	while ($arUser = $resultQuery->fetch())
	{
		$arUser = CIMStatus::prepareLastDate($arUser);

		foreach ($arUser as $key => $value)
		{
			$arUser[$key] = !is_array($value) && !is_object($value)? htmlspecialcharsEx($value): $value;
		}

		$arSource[$arUser["ID"]]["PERSONAL_PHOTO"] = $arUser["PERSONAL_PHOTO"];

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

		$arUser['PERSONAL_BIRTHDAY'] = $arUser['PERSONAL_BIRTHDAY'] instanceof BitrixMainTypeDate? $arUser['PERSONAL_BIRTHDAY']->format('d-m'): false;
		$arUser['LAST_ACTIVITY_DATE'] = $arUser['LAST_ACTIVITY_DATE'] instanceof BitrixMainTypeDateTime? $arUser['LAST_ACTIVITY_DATE']: false;

		$userExternalAuthId = $arUser['EXTERNAL_AUTH_ID']? $arUser['EXTERNAL_AUTH_ID']: 'default';
		if (
			$userExternalAuthId == BitrixImBot::EXTERNAL_AUTH_ID
			&& $bots[$arUser["ID"]]['TYPE'] == BitrixImBot::TYPE_NETWORK
			&& (
				$bots[$arUser["ID"]]['CLASS'] == BitrixImBotBotSupport24::class
				|| $bots[$arUser["ID"]]['CLASS'] == BitrixImBotBotPartner24::class
				|| $bots[$arUser["ID"]]['CLASS'] == BitrixImBotBotSaleSupport24::class
			)
		)
		{
			$userExternalAuthId = 'support24';
		}

		$arUsers[$arUser["ID"]] = Array(
			'id' => $arUser["ID"],
			'name' => BitrixImUser::formatFullNameFromDatabase($arUser),
			'active' => $arUser['ACTIVE'] == 'Y',
			'first_name' => BitrixImUser::formatNameFromDatabase($arUser),
			'last_name' => $arUser['LAST_NAME'],
			'work_position' => $arUser['WORK_POSITION'],
			'color' => $color,
			'avatar' => CIMChat::GetAvatarImage($arUser["PERSONAL_PHOTO"]),
			'avatar_id' => $arUser["PERSONAL_PHOTO"],
			'birthday' => $arUser['PERSONAL_BIRTHDAY'],
			'gender' => $arUser['PERSONAL_GENDER'] == 'F'? 'F': 'M',
			'phone_device' => $bVoximplantEnable && $arUser['UF_VI_PHONE'] == 'Y',
			'phones' => $bVoximplantEnable && $arUser['UF_VI_PHONE'] == 'Y',
			'extranet' => self::IsExtranet($arUser),
			'tz_offset' => intval($arUser['TIME_ZONE_OFFSET']),
			'network' => $arUser['EXTERNAL_AUTH_ID'] == self::NETWORK_AUTH_ID || $arUser['EXTERNAL_AUTH_ID'] == BitrixImBot::EXTERNAL_AUTH_ID && $bots[$arUser["ID"]]['TYPE'] == BitrixImBot::TYPE_NETWORK,
			'bot' => $arUser['EXTERNAL_AUTH_ID'] == BitrixImBot::EXTERNAL_AUTH_ID,
			'connector' => $arUser['EXTERNAL_AUTH_ID'] == "imconnector",
			'profile' => CIMContactList::GetUserPath($arUser["ID"]),
			'external_auth_id' => $userExternalAuthId,
			'status' => $arUser['STATUS'],
			'idle' => $arUser['IDLE']?: false,
			'last_activity_date' => $arUser['LAST_ACTIVITY_DATE']?: false,
			'mobile_last_date' => $arUser['MOBILE_LAST_DATE']?: false,
			'desktop_last_date' => $arUser['DESKTOP_LAST_DATE']?: false,
			'departments' => $getDepartment && is_array($arUser["UF_DEPARTMENT"]) && !empty($arUser["UF_DEPARTMENT"])? array_values($arUser["UF_DEPARTMENT"]): Array(),
			'absent' => self::formatAbsentResult($arUser["ID"]),
		);

		$services = [];
		if (!empty($arUser['UF_ZOOM']))
		{
			$services['zoom'] = $arUser['UF_ZOOM'];
		}
		if (!empty($arUser['UF_SKYPE_LINK']))
		{
			$services['skype'] = $arUser['UF_SKYPE_LINK'];
		}
		else if (!empty($arUser['UF_SKYPE']))
		{
			$services['skype'] = 'skype://'.$arUser['UF_SKYPE'];
		}

		$arUsers[$arUser["ID"]]['services'] = empty($services)? null: array_change_key_case($services, CASE_LOWER);

		if ($extraFields)
		{
			$arUsers[$arUser["ID"]]['website'] = $arUser['PERSONAL_WWW'];
			$arUsers[$arUser["ID"]]['email'] = $arUser['EMAIL'];
		}

		foreach($arUsers[$arUser["ID"]]["departments"] as $dep_id)
		{
			if (isset($arUserInGroup[$dep_id]))
				$arUserInGroup[$dep_id]['users'][] = $arUser["ID"];
			else
				$arUserInGroup[$dep_id] = Array('id' => $dep_id, 'users' => Array($arUser["ID"]));
		}

		if ($getHrPhoto)
		{
			$arHrPhoto[$arUser["ID"]] = $arUsers[$arUser["ID"]]['avatar'];
		}

		if ($getPhones)
		{
			if (CModule::IncludeModule('voximplant'))
			{
				$result = CVoxImplantPhone::Normalize($arUser["WORK_PHONE"]);
				if ($result)
				{
					$arPhones[$arUser["ID"]]['WORK_PHONE'] = $arUser['WORK_PHONE'];
				}
				$result = CVoxImplantPhone::Normalize($arUser["PERSONAL_MOBILE"]);
				if ($result)
				{
					$arPhones[$arUser["ID"]]['PERSONAL_MOBILE'] = $arUser['PERSONAL_MOBILE'];
				}
				$result = CVoxImplantPhone::Normalize($arUser["PERSONAL_PHONE"]);
				if ($result)
				{
					$arPhones[$arUser["ID"]]['PERSONAL_PHONE'] = $arUser['PERSONAL_PHONE'];
				}
				$result = preg_replace("/[^0-9#*]/i", "", $arUser["UF_PHONE_INNER"]);
				if ($result)
				{
					$arPhones[$arUser["ID"]]['INNER_PHONE'] = $result;
				}
			}
			else
			{
				$arPhones[$arUser["ID"]]['WORK_PHONE'] = $arUser['WORK_PHONE'];
				$arPhones[$arUser["ID"]]['PERSONAL_MOBILE'] = $arUser['PERSONAL_MOBILE'];
				$arPhones[$arUser["ID"]]['PERSONAL_PHONE'] = $arUser['PERSONAL_PHONE'];
				$arPhones[$arUser["ID"]]['INNER_PHONE'] = $arUser['UF_PHONE_INNER'];
			}

			if (isset($arPhones[$arUser["ID"]]))
			{
				$arUsers[$arUser["ID"]]['phones'] = array_change_key_case($arPhones[$arUser["ID"]], CASE_LOWER);
			}
		}
	}

	$result = array('users' => $arUsers, 'hrphoto' => $arHrPhoto, 'userInGroup' => $arUserInGroup, 'phones' => $arPhones, 'source' => $arSource);

	if($useCache)
	{
		$cacheTag = array();
		if($obCache->StartDataCache())
		{
			if(defined("BX_COMP_MANAGED_CACHE"))
			{
				global $CACHE_MANAGER;
				$CACHE_MANAGER->StartTagCache($cache_dir);
				if(is_array($arParams['ID']))
				{
					foreach ($arParams['ID'] as $id)
					{
						$tag = 'USER_NAME_'.intval($id);
						if(!in_array($tag, $cacheTag))
						{
							$cacheTag[] = $tag;
							$CACHE_MANAGER->RegisterTag($tag);
						}
					}
				}
				elseif (isset($arParams['ID']) && intval($arParams['ID']) > 0)
				{
					$tag = 'USER_NAME_'.intval($arParams['ID']);
					$CACHE_MANAGER->RegisterTag($tag);
				}
				$CACHE_MANAGER->EndTagCache();
			}
			$obCache->EndDataCache($result);
			unset($cacheTag);
		}
	}

	unset($result['source']);

	return $result;
}