• Модуль: socialnetwork
  • Путь к файлу: ~/bitrix/modules/socialnetwork/classes/general/log_destination.php
  • Класс: CSocNetLogDestination
  • Вызов: CSocNetLogDestination::searchUsers
static function searchUsers($search, &$nt = "", $bSelf = true, $bEmployeesOnly = false, $bExtranetOnly = false, $departmentId = false)
{
	global $USER, $DB;

	CUtil::JSPostUnescape();

	$nameTemplate = $nt;
	$bEmailUsers = false;
	$bCrmEmailUsers = false;
	$bActiveOnly = true;
	$bNetworkSearch = false;
	$bSearchOnlyWithEmail = false;
	$allowBots = false;
	$showAllExtranetContacts = false;

	if (is_array($search))
	{
		$arParams = $search;
		$search = $arParams["SEARCH"];
		$nameTemplate = ($arParams["NAME_TEMPLATE"] ?? '');
		$bSelf = ($arParams["SELF"] ?? true);
		$bEmployeesOnly = ($arParams["EMPLOYEES_ONLY"] ?? false);
		$bExtranetOnly = ($arParams["EXTRANET_ONLY"] ?? false);
		$departmentId = ($arParams["DEPARTAMENT_ID"] ?? false);
		$bEmailUsers = ($arParams["EMAIL_USERS"] ?? false);
		$bCrmEmailUsers = (isset($arParams["CRMEMAIL_USERS"]) && ModuleManager::isModuleInstalled('crm') ? $arParams["CRMEMAIL_USERS"] : false);
		$bActiveOnly = (isset($arParams["CHECK_ACTIVITY"]) && $arParams["CHECK_ACTIVITY"] === false ? false : true);
		$bNetworkSearch = ($arParams["NETWORK_SEARCH"] ?? false);
		$bSearchOnlyWithEmail = ($arParams["ONLY_WITH_EMAIL"] ?? false);
		$allowBots = ($arParams['ALLOW_BOTS'] ?? false);
		$showAllExtranetContacts = ($arParams['SHOW_ALL_EXTRANET_CONTACTS'] ?? false);
	}

	$arUsers = array();
	$search = trim($search);
	if (
		$search == ''
		|| !GetFilterQuery("TEST", $search)
	)
	{
		return $arUsers;
	}

	$bSearchByEmail = false;

	if (preg_match('/^([^<]+)s<([^>]+)>$/i', $search, $matches)) // email
	{
		$search = $matches[2];
		$nt = $search;
		$bSearchByEmail = true;
	}

	$bIntranetEnabled = IsModuleInstalled('intranet');
	$bExtranetEnabled = CModule::IncludeModule('extranet');
	$bMailEnabled = IsModuleInstalled('mail');
	$bBitrix24Enabled = IsModuleInstalled('bitrix24');

	$bEmailUsersAll = ($bMailEnabled && BitrixMainConfigOption::get('socialnetwork', 'email_users_all', 'N') === 'Y');
	$bExtranetUser = ($bExtranetEnabled && !CExtranet::IsIntranetUser());

	$current_user_id = (int)$USER->getId();

	if ($bExtranetEnabled)
	{
		CSocNetTools::InitGlobalExtranetArrays();
	}

	$arSearchValue = preg_split('/s+/', trim(ToUpper($search)));
	array_walk($arSearchValue, array('CSocNetLogDestination', '__percent_walk'));

	$arMyUserId = array();

	$filter = [];

	$useFulltextIndex = class_exists('BitrixMainUserIndexTable');

	if ($useFulltextIndex)
	{
		$filter['*INDEX.SEARCH_USER_CONTENT'] = BitrixMainSearchContent::prepareStringToken(implode(' ', $arSearchValue));
	}
	else
	{
		if (count($arSearchValue) == 2)
		{
			$arLogicFilter = array(
				'LOGIC' => 'OR',
				array('LOGIC' => 'AND', 'NAME' => $arSearchValue[0], 'LAST_NAME' => $arSearchValue[1]),
				array('LOGIC' => 'AND', 'NAME' => $arSearchValue[1], 'LAST_NAME' => $arSearchValue[0]),
			);
		}
		else
		{
			$arLogicFilter = array(
				'LOGIC' => 'OR',
				'NAME' => $arSearchValue,
				'LAST_NAME' => $arSearchValue,
			);

			if (
				$bIntranetEnabled
				&& count($arSearchValue) == 1
				&& mb_strlen($arSearchValue[0]) > 2
			)
			{
				$arLogicFilter['LOGIN'] = $arSearchValue[0];
			}
		}

		$filter[] = $arLogicFilter;
	}

	if ($bActiveOnly)
	{
		$filter['=ACTIVE'] = 'Y';
	}

	if ($bIntranetEnabled)
	{
		$arExternalAuthId = self::getExternalAuthIdBlackList(array(
			'NETWORK_SEARCH' => $bNetworkSearch,
			'ALLOW_BOTS' => $allowBots
		));

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

		if (
			($bEmailUsers || $bCrmEmailUsers)
			&& $bMailEnabled
			&& !$bEmailUsersAll
		)
		{
			$finderDestFilter = array(
				"USER_ID" => $current_user_id,
				"=CODE_TYPE" => "U",
				"=CODE_USER.EXTERNAL_AUTH_ID" => 'email'
			);
			$finderDestSelect = array(
				'CODE_USER_ID'
			);

			if ($bCrmEmailUsers)
			{
				$finderDestFilter['!=CODE_USER.UF_USER_CRM_ENTITY'] = false;
				$finderDestSelect[] = 'CODE_USER.UF_USER_CRM_ENTITY';
			}

			$rsUser = BitrixMainFinderDestTable::getList(array(
				'order' => array(),
				'filter' => $finderDestFilter,
				'group' => array("CODE_USER_ID"),
				'select' => $finderDestSelect
			));

			while ($arUser = $rsUser->fetch())
			{
				$arMyUserId[] = $arUser['CODE_USER_ID'];
			}
		}
	}

	if (
		!$bNetworkSearch
		&& (
			$bIntranetEnabled
			|| COption::GetOptionString("main", "new_user_registration_email_confirmation", "N") === "Y"
		)
	)
	{
		$filter["CONFIRM_CODE"] = false;
	}

	$bFilteredByMyUserId = false;

	if(
		$bIntranetEnabled
		&& $bExtranetEnabled
		&& !$bCrmEmailUsers
	) // consider extranet collaboration
	{
		CExtranet::fillUserListFilterORM(
			array(
				"CURRENT_USER_ID" => $current_user_id,
				"EXTRANET_USER" => $bExtranetUser,
				"INTRANET_ONLY" => ($bEmployeesOnly || ($bBitrix24Enabled && !$bExtranetEnabled)),
				"EXTRANET_ONLY" => $bExtranetOnly,
				"EMAIL_USERS_ALL" => $bEmailUsersAll,
				"MY_USERS" => $arMyUserId,
				'ALLOW_BOTS' => $allowBots,
				'SHOW_ALL_EXTRANET_CONTACTS' => $showAllExtranetContacts
			),
			$filter,
			$bFilteredByMyUserId
		);

		if (!$filter)
		{
			return $arUsers;
		}

		if ($bNetworkSearch)
		{
			end($filter);
			$filter[key($filter)]["=EXTERNAL_AUTH_ID"] = "replica";
		}
	}

	if (
		!empty($arMyUserId)
		&& !$bFilteredByMyUserId
	)
	{
		$filter[] = array(
			'LOGIC' => 'OR',
			'!=EXTERNAL_AUTH_ID' => 'email',
			'ID' => $arMyUserId,
		);
	}

	if ($bSearchOnlyWithEmail)
	{
		$filter["!EMAIL"] = false;
	}

	$select = array(
		"ID",
		"ACTIVE",
		"NAME",
		"LAST_NAME",
		"SECOND_NAME",
		"EMAIL",
		"LOGIN",
		"WORK_POSITION",
		"PERSONAL_PROFESSION",
		"PERSONAL_PHOTO",
		"PERSONAL_GENDER",
		"EXTERNAL_AUTH_ID",
		new BitrixMainEntityExpressionField('MAX_LAST_USE_DATE', 'MAX(%s)', array('BitrixMainFinderDest:CODE_USER_CURRENT.LAST_USE_DATE'))
	);

	if ($bCrmEmailUsers)
	{
		$select[] = "UF_USER_CRM_ENTITY";
	}

	if (!$bActiveOnly)
	{
		$select[] = "ACTIVE";
	}

	if ($useFulltextIndex)
	{
		$select['SEARCH_USER_CONTENT'] = 'INDEX.SEARCH_USER_CONTENT';
	}

	$db_events = GetModuleEvents("socialnetwork", "OnSocNetLogDestinationSearchUsers");
	while ($arEvent = $db_events->Fetch())
	{
		ExecuteModuleEventEx($arEvent, array($arSearchValue, &$filter, &$select));
	}

	$rsUser = null;
	if ($useFulltextIndex)
	{
		$rsUserFulltext = BitrixMainUserTable::getList(array(
			'order' => array(
				"MAX_LAST_USE_DATE" => 'DESC',
				'LAST_NAME' => 'ASC'
			),
			'filter' => $filter,
			'select' => [
				'ID',
				new BitrixMainEntityExpressionField('MAX_LAST_USE_DATE', 'MAX(%s)', array('BitrixMainFinderDest:CODE_USER_CURRENT.LAST_USE_DATE'))
			],
			'limit' => 100,
			'data_doubling' => false
		));

		$userIdList = [];

		while ($arUser = $rsUserFulltext->fetch())
		{
			$userIdList[] = $arUser['ID'];
		}

		if (!empty($userIdList))
		{
			$rsUser = BitrixMainUserTable::getList(array(
				'order' => array(
					"MAX_LAST_USE_DATE" => 'DESC',
					'LAST_NAME' => 'ASC'
				),
				'filter' => [
					'@ID' => $userIdList
				],
				'select' => $select
			));
		}
	}
	else
	{
		$rsUser = BitrixMainUserTable::getList(array(
			'order' => array(
				"MAX_LAST_USE_DATE" => 'DESC',
				'LAST_NAME' => 'ASC'
			),
			'filter' => $filter,
			'select' => $select,
			'limit' => 100,
			'data_doubling' => false
		));
	}

	$queryResultCnt = 0;
	if ($rsUser !== null)
	{
		$bUseLogin = (mb_strlen($search) > 3 && mb_strpos($search, '@') > 0);
		$params = array(
			"NAME_TEMPLATE" => $nameTemplate,
			"USE_EMAIL" => $bSearchByEmail,
			"USE_LOGIN" => $bUseLogin,
			"ONLY_WITH_EMAIL" => $bSearchOnlyWithEmail
		);
		while ($arUser = $rsUser->fetch())
		{
			$queryResultCnt++;
			if (
				!$bSelf
				&& $current_user_id === (int)$arUser['ID']
			)
			{
				continue;
			}

			if (intval($departmentId) > 0)
			{
				$arUserGroupCode = CAccess::GetUserCodesArray($arUser["ID"]);

				if (!in_array("DR".intval($departmentId), $arUserGroupCode))
				{
					continue;
				}
			}

			$arUser = (
			$arUser["EXTERNAL_AUTH_ID"] === "replica"
				? self::formatNetworkUser($arUser, $params)
				: self::formatUser($arUser, $params)
			);

			$arUsers[$arUser["id"]] = $arUser;
		}
	}

	if (
		($bEmailUsers || $bCrmEmailUsers || $bSearchOnlyWithEmail)
		&& !$queryResultCnt
		&& check_email($search, true)
	)
	{
		$arEmailFilter = array(
			'ACTIVE' => 'Y',
			'=EMAIL_OK' => 1
		);

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

		$rsUser = BitrixMainUserTable::getList(array(
			'order' => array(),
			'filter' => $arEmailFilter,
			'select' => array(
				"ID",
				"NAME",
				"LAST_NAME",
				"SECOND_NAME",
				"EMAIL",
				"LOGIN",
				"WORK_POSITION",
				"PERSONAL_PROFESSION",
				"PERSONAL_PHOTO",
				"PERSONAL_GENDER",
				"EXTERNAL_AUTH_ID",
				new BitrixMainEntityExpressionField('EMAIL_OK', 'CASE WHEN UPPER(%s) = "'.$DB->ForSql(mb_strtoupper(str_replace('%', '%%', $search))).'" THEN 1 ELSE 0 END', 'EMAIL')
			),
			'limit' => 10
		));

		while ($arUser = $rsUser->fetch())
		{
			$arUsers['U'.$arUser["ID"]] = self::formatUser($arUser, array(
				"NAME_TEMPLATE" => $nameTemplate,
				"USE_EMAIL" => true,
				"ONLY_WITH_EMAIL" => $bSearchOnlyWithEmail
			));
		}
	}

	return $arUsers;
}