Пример обработчика события для автоматического определения логина по email или телефону, который можно добавить в bitrix/php_interface/init.php:
Код |
---|
<?php
use Bitrix\Main\EventManager;
use Bitrix\Main\UserTable;
use Bitrix\Main\Context;
EventManager::getInstance()->addEventHandler('main', 'OnBeforeUserLogin', function (&$arFields) {
$input = trim($arFields['LOGIN'] ?? '');
if (empty($input) || strlen($input) > 255) return;
// Проверяем, не является ли ввод уже валидным логином
$userByLogin = UserTable::query()
->setSelect(['ID', 'LOGIN'])
->where('LOGIN', $input)
->where('ACTIVE', 'Y')
->fetch();
if ($userByLogin) return;
// Поиск по email
if (filter_var($input, FILTER_VALIDATE_EMAIL)) {
$user = UserTable::query()
->setSelect(['LOGIN'])
->where('EMAIL', $input)
->where('ACTIVE', 'Y')
->fetch();
if ($user) {
$arFields['LOGIN'] = $user['LOGIN'];
return;
}
}
// Нормализация и поиск по телефону
$phone = normalizePhone($input);
if ($phone) {
$searchFields = ['PERSONAL_MOBILE', 'PERSONAL_PHONE'];
foreach ($searchFields as $field) {
$user = UserTable::query()
->setSelect(['LOGIN'])
->where($field, $phone)
->where('ACTIVE', 'Y')
->fetch();
if ($user) {
$arFields['LOGIN'] = $user['LOGIN'];
return;
}
}
}
});
// Функция нормализации телефона
function normalizePhone($rawPhone) {
$digits = preg_replace('/\D/', '', $rawPhone);
if (strlen($digits) === 10) {
return '+7' . $digits;
} elseif (strlen($digits) === 11 && $digits[0] === '8') {
return '+7' . substr($digits, 1);
} elseif (strlen($digits) === 11 && $digits[0] === '7') {
return '+' . $digits;
}
return null;
} |
Он автоматически определяет логин пользователя по введенному email или телефону при авторизации через стандартные формы Битрикс.