В 1С-Битрикс нет встроенной готовой опции "Email как логин" в настройках. Поля LOGIN и EMAIL — это разные поля в таблице пользователей. Однако эту задачу можно решить программно.
Способ 1. Через событие OnBeforeUserRegister (рекомендуемый)
При регистрации через стандартный компонент bitrix:main.register срабатывает событие OnBeforeUserRegister. В обработчике можно подменить значение логина на email.
Создайте файл init.php (в /bitrix/php_interface/ или /local/php_interface/) и добавьте:
<?php
// Регистрируем обработчик события OnBeforeUserRegister
AddEventHandler('main', 'OnBeforeUserRegister', 'setEmailAsLoginHandler');
function setEmailAsLoginHandler(&$arFields)
{
// Если логин не заполнен, подставляем email в качестве логина
if (empty($arFields['LOGIN']) && !empty($arFields['EMAIL']))
{
$arFields['LOGIN'] = $arFields['EMAIL'];
}
// Если логин отличается от email — принудительно заменяем
elseif (!empty($arFields['EMAIL']))
{
$arFields['LOGIN'] = $arFields['EMAIL'];
}
}
?>
Событие OnBeforeUserRegister (модуль main, файл /bitrix/modules/main/install/components/bitrix/main.register/component.php) вызывается перед созданием пользователя через компонент регистрации. $arFields содержит поля, которые будут переданы в CUser::Add().
Способ 2. Через событие OnBeforeUserAdd (универсальный)
Если пользователь создаётся не только через компонент регистрации, но и программно через CUser::Add() — подойдёт событие OnBeforeUserAdd (модуль main, файл /bitrix/modules/main/classes/general/user.php):
<?php
AddEventHandler('main', 'OnBeforeUserAdd', 'setEmailAsLoginOnAdd');
function setEmailAsLoginOnAdd(&$arFields)
{
if (empty($arFields['LOGIN']) && !empty($arFields['EMAIL']))
{
$arFields['LOGIN'] = $arFields['EMAIL'];
}
}
?>
Способ 3. Авторизация по email
Стандартный метод CUser::Login($login, $password) (модуль main, класс CUser, файл /bitrix/modules/main/classes/general/user.php, строка 1736) ищет пользователя по полю LOGIN. Если вы подставили email в LOGIN — авторизация будет работать автоматически.
Если нужно, чтобы пользователь мог вводить email в поле логина при авторизации (без изменения самого логина), используйте событие OnBeforeUserLogin:
<?php
AddEventHandler('main', 'OnBeforeUserLogin', 'authByEmailHandler');
function authByEmailHandler(&$arFields)
{
// Проверяем, не является ли введённый логин email'ом
if (check_email($arFields['LOGIN']))
{
// Ищем пользователя по email
$rsUser = CUser::GetList(
$by = 'ID', $order = 'ASC',
['=EMAIL' => $arFields['LOGIN']]
);
if ($arUser = $rsUser->Fetch())
{
// Подставляем реальный логин для авторизации
$arFields['LOGIN'] = $arUser['LOGIN'];
}
}
}
?>
Что важно учесть
- Уникальность: Поле
LOGINдолжно быть уникальным в таблицеb_user. Если у двух пользователей email совпадёт — возникнет ошибка. Предусмотрите проверку. - Длина логина: Стандартное ограничение поля LOGIN — 50 символов (в БД
varchar(50)). Если email длиннее, нужно расширять поле либо обрезать. - Символы: Логин по умолчанию может содержать только латиницу, цифры, дефис и подчёркивание. Email содержит
@и.— это допускается в современных версиях Битрикс, но уточните в своей. - Главный модуль: В настройках Настройки > Настройки продукта > Настройки модулей > Главный модуль на вкладке Авторизация можно установить флаг "Email является обязательным полем" — это не делает email логином, но гарантирует, что email будет заполнен.