• Модуль: socialnetwork
  • Путь к файлу: ~/bitrix/modules/socialnetwork/classes/general/log_destination.php
  • Класс: CSocNetLogDestination
  • Вызов: CSocNetLogDestination::GetUsers
static function GetUsers($arParams = Array(), $bSelf = true)
{
	global $USER, $CACHE_MANAGER;

	$userId = (int)$USER->GetID();

	if (
		isset($arParams['all'])
		&& $arParams['all'] === 'Y'
	)
	{
		if (IsModuleInstalled("intranet"))
		{
			return self::getUsersAll($arParams);
		}

		$arParamsNew = $arParams;
		$arParamsNew["id"] = array($userId);
		unset($arParamsNew["all"]);

		return CSocNetLogDestination::GetUsers($arParamsNew, $bSelf);
	}

	$bExtranet = false;
	$filter = [];
	if (
		!isset($arParams['IGNORE_ACTIVITY'])
		|| $arParams['IGNORE_ACTIVITY'] !== 'Y'
	)
	{
		$filter['=ACTIVE'] = 'Y';
	}

	if (
		isset($arParams['ONLY_WITH_EMAIL'])
		&& $arParams['ONLY_WITH_EMAIL'] === 'Y'
	)
	{
		$filter['!=EMAIL'] = false;
	}

	$arExternalAuthId = self::getExternalAuthIdBlackList([
		'ALLOW_BOTS' => (isset($arParams['ALLOW_BOTS']) && $arParams['ALLOW_BOTS'] === true)
	]);

	if (!empty($arExternalAuthId))
	{
		$filter['!=EXTERNAL_AUTH_ID'] = $arExternalAuthId;
	}

	if (
		(
			!isset($arParams['IGNORE_ACTIVITY'])
			|| $arParams['IGNORE_ACTIVITY'] !== 'Y'
		)
		&& (
			IsModuleInstalled("intranet")
			|| COption::GetOptionString("main", "new_user_registration_email_confirmation", "N") === "Y"
		)
	)
	{
		$filter["=CONFIRM_CODE"] = false;
	}

	$select = [ "ID", "LAST_NAME", "NAME", "SECOND_NAME", "LOGIN", "EMAIL", "PERSONAL_PHOTO", "WORK_POSITION", "PERSONAL_PROFESSION", "IS_ONLINE", "EXTERNAL_AUTH_ID" ];

	if (
		isset($arParams["CRM_ENTITY"])
		&& $arParams["CRM_ENTITY"] === "Y"
		&& ModuleManager::isModuleInstalled('crm')
	)
	{
		$select[] = 'UF_USER_CRM_ENTITY';
	}

	if (ModuleManager::isModuleInstalled('intranet'))
	{
		$select[] = 'USER_TYPE';
		$select[] = 'UF_DEPARTMENT';
	}

	if (array_key_exists('id', $arParams))
	{
		if (empty($arParams['id']))
		{
			$filter['ID'] = $userId;
		}
		else
		{
			$arSelect = array($userId);
			foreach ($arParams['id'] as $value)
			{
				if (
					intval($value) > 0
					&& !in_array($value, $arSelect)
				)
				{
					$arSelect[] = intval($value);
				}
			}
			sort($arSelect);
			$filter['@ID'] = $arSelect;
		}
	}
	elseif (isset($arParams['deportament_id']))
	{
		if (is_array($arParams['deportament_id']))
		{
			$filter['=UF_DEPARTMENT'] = $arParams['deportament_id'];
		}
		else
		{
			if ($arParams['deportament_id'] === 'EX')
			{
				$bExtranet = true;
			}
			else
			{
				$filter['UF_DEPARTMENT'] = intval($arParams['deportament_id']);
			}
		}
	}

	$avatarSize = array(
		"width" => (intval($arParams["THUMBNAIL_SIZE_WIDTH"] ?? 0) > 0 ? $arParams["THUMBNAIL_SIZE_WIDTH"] : 100),
		"height" => (intval($arParams["THUMBNAIL_SIZE_HEIGHT"] ?? 0) > 0 ? $arParams["THUMBNAIL_SIZE_HEIGHT"] : 100)
	);

	$cacheTtl = 3153600;
	$cacheId = 'socnet_destination_getusers_'.md5(serialize($filter)).$bSelf.CSocNetUser::IsCurrentUserModuleAdmin().($bExtranet ? '_ex_'.$userId : '').md5(serialize($avatarSize));
	$cacheDir = '/socnet/dest/'.(
		isset($arParams['id'])
			? 'user'
			: 'dept'
	) . '/' . mb_substr(md5($cacheId), 0, 2) . '/';

	$obCache = new CPHPCache;
	if($obCache->InitCache($cacheTtl, $cacheId, $cacheDir))
	{
		$arUsers = $obCache->GetVars();
	}
	else
	{
		$obCache->StartDataCache();
		if(defined("BX_COMP_MANAGED_CACHE"))
		{
			$CACHE_MANAGER->StartTagCache($cacheDir);
		}

		if (
			$bExtranet
			&& CModule::IncludeModule("extranet")
		)
		{
			$extranetSiteId = CExtranet::GetExtranetSiteID();

			// get all extranet groups and set tags
			$rsSonetGroup = CSocNetUserToGroup::GetList(
				array(),
				array(
					"USER_ID" => $USER->GetId(),
					"GROUP_SITE_ID" => $extranetSiteId
				),
				false,
				false,
				array("GROUP_ID")
			);
			while($arSonetGroup = $rsSonetGroup->Fetch())
			{
				$CACHE_MANAGER->RegisterTag("sonet_user2group_G".$arSonetGroup["GROUP_ID"]);
			}

			$CACHE_MANAGER->RegisterTag("sonet_user2group_U".$USER->GetId());

			$arUsers = Array();
			$arExtranetUsers = CExtranet::GetMyGroupsUsersFull($extranetSiteId, $bSelf);
			foreach($arExtranetUsers as $arUserTmp)
			{
				if (!empty($arUserTmp['UF_DEPARTMENT']))
				{
					continue;
				}

				$sName = trim(CUser::FormatName(empty($arParams["NAME_TEMPLATE"]) ? CSite::GetNameFormat(false) : $arParams["NAME_TEMPLATE"], $arUserTmp, true, false));
				if (empty($sName))
				{
					$sName = $arUserTmp["~LOGIN"];
				}

				$arFileTmp = CFile::ResizeImageGet(
					$arUserTmp["PERSONAL_PHOTO"],
					$avatarSize,
					BX_RESIZE_IMAGE_EXACT,
					false
				);

				$arUsers['U'.$arUserTmp["ID"]] = Array(
					'id' => 'U'.$arUserTmp["ID"],
					'entityId' => $arUserTmp["ID"],
					'email' => $arUserTmp["EMAIL"] ? $arUserTmp["EMAIL"] : '',
					'name' => $sName,
					'avatar' => empty($arFileTmp['src'])? '': $arFileTmp['src'],
					'desc' => self::getUserDescription($arUserTmp, [
						'showEmail' => !empty($arParams["ONLY_WITH_EMAIL"])
					]),
				);
				if (defined("BX_COMP_MANAGED_CACHE"))
				{
					$CACHE_MANAGER->RegisterTag("USER_NAME_".intval($arUserTmp["ID"]));
				}
			}
		}
		else
		{
			$bExtranetInstalled = CModule::IncludeModule("extranet");
			CSocNetTools::InitGlobalExtranetArrays();

			if (
				!isset($filter['UF_DEPARTMENT'])
				&& $bExtranetInstalled
			)
			{
				$arUserIdVisible = CExtranet::GetMyGroupsUsersSimple(SITE_ID);
			}

			$order = [ 'LAST_NAME' => 'ASC' ];

			$arUsers = Array();

			$className = (BitrixMainLoader::includeModule('intranet') ? 'BitrixIntranetUserTable' : 'BitrixMainUserTable');
			$res = $className::getList([
				'order' => $order,
				'filter' => $filter,
				'select' => $select
			]);

			while ($arUser = $res->fetch())
			{
				foreach($arUser as $key => $value)
				{
					if (is_string($value))
					{
						$arUser[$key] = BitrixMainTextHtmlFilter::encode($value);
					}
				}

				if (
					!$bSelf
					&& is_object($USER)
					&& $userId == $arUser["ID"]
				)
				{
					continue;
				}

				if (
					!isset($filter['UF_DEPARTMENT']) // all users
					&& $bExtranetInstalled
				)
				{
					if (
						isset($arUser["UF_DEPARTMENT"])
						&& $arUser['EXTERNAL_AUTH_ID'] !== 'email'
						&& (
							$arUser['EXTERNAL_AUTH_ID'] !== 'bot'
							|| !isset($arParams['ALLOW_BOTS'])
							|| $arParams['ALLOW_BOTS'] !== true
						)
						&& (
							!is_array($arUser["UF_DEPARTMENT"])
							|| empty($arUser["UF_DEPARTMENT"])
							|| (int)$arUser["UF_DEPARTMENT"][0] <= 0
						) // extranet user
						&& (
							empty($arUserIdVisible)
							|| !is_array($arUserIdVisible)
							|| !in_array($arUser["ID"], $arUserIdVisible)
						)
					)
					{
						continue;
					}
				}

				$sName = trim(CUser::FormatName(empty($arParams["NAME_TEMPLATE"]) ? CSite::GetNameFormat(false) : $arParams["NAME_TEMPLATE"], $arUser, true, false));

				if (empty($sName))
				{
					$sName = htmlspecialcharsBack($arUser["LOGIN"]);
				}

				$arFileTmp = CFile::ResizeImageGet(
					$arUser["PERSONAL_PHOTO"],
					$avatarSize,
					BX_RESIZE_IMAGE_EXACT,
					false
				);

				$arUsers['U'.$arUser["ID"]] = Array(
					'id' => 'U'.$arUser["ID"],
					'entityId' => $arUser["ID"],
					'email' => $arUser["EMAIL"],
					'name' => $sName,
					'avatar' => empty($arFileTmp['src'])? '': $arFileTmp['src'],
					'desc' => self::getUserDescription($arUser, [
						'showEmail' => !empty($arParams["ONLY_WITH_EMAIL"])
					]),
					'isExtranet' => (isset($arUser['USER_TYPE']) && $arUser['USER_TYPE'] === 'extranet' ? "Y" : "N"),
					'isEmail' => ($arUser['EXTERNAL_AUTH_ID'] === 'email' ? 'Y' : 'N'),
					'isCrmEmail' => (
						$arUser['EXTERNAL_AUTH_ID'] === 'email'
						&& !empty($arUser['UF_USER_CRM_ENTITY'])
							? 'Y'
							: 'N'
					)
				);

				if ($arUser['EXTERNAL_AUTH_ID'] === 'email')
				{
					$arUsers['U'.$arUser["ID"]]['email'] = $arUser['EMAIL'];
				}

				$arUsers['U'.$arUser["ID"]]['checksum'] = md5(serialize($arUsers['U'.$arUser["ID"]]));

				if (defined("BX_COMP_MANAGED_CACHE"))
				{
					$CACHE_MANAGER->RegisterTag("USER_NAME_".intval($arUser["ID"]));
				}
			}
		}

		if (defined("BX_COMP_MANAGED_CACHE"))
		{
			$CACHE_MANAGER->RegisterTag("USER_NAME");
			if (!empty($filter['UF_DEPARTMENT']))
			{
				$CACHE_MANAGER->RegisterTag('intranet_department_'.$filter['UF_DEPARTMENT']);
			}
			$CACHE_MANAGER->EndTagCache();
		}

		$obCache->EndDataCache($arUsers);
	}

	return $arUsers;
}