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;
}