Регистрации через E-mail в Битрикс. Email вместо логина

Архитектурный подход

1. Подготовка компонента

Создаем кастомный компонент регистрации:

Копируем bitrix:main.register в свое пространство имен и допиливаем его там.

/local/components/custom/
└── main.register/
    ├── component.php
    ├── .parameters.php
    ├── templates/
    │   └── flat/
    │       ├── template.php
    │       └── result_modifier.php
    └── lang/
        └── ru/
            ├── component.php
            └── template.php

Инициализация компонента:

<?php
$APPLICATION->IncludeComponent("custom:main.register", "flat", [
    "AUTH" => "Y",
    "REQUIRED_FIELDS" => [
        "EMAIL", "NAME", "LAST_NAME", 
        "WORK_COMPANY", "PERSONAL_PHONE", "PERSONAL_STREET"
    ],
    "SHOW_FIELDS" => [
        "EMAIL", "NAME", "LAST_NAME",
        "WORK_COMPANY", "PERSONAL_PHONE", "PERSONAL_STREET",
        "PASSWORD", "CONFIRM_PASSWORD"
    ],
    "SUCCESS_PAGE" => "/personal/",
    "SET_TITLE" => "Y",
    "USE_BACKURL" => "Y"
], false);

2. Модификация логики компонента

В component.php:

// Изменяем стандартные поля
$arDefaultFields = [
    "EMAIL",          // E-mail как основное поле
    "PASSWORD",
    "CONFIRM_PASSWORD"
];

// Удаляем логин из обязательных полей
if (($key = array_search("LOGIN", $arParams["REQUIRED_FIELDS"])) !== false) {
    unset($arParams["REQUIRED_FIELDS"][$key]);
}

3. Обработчики событий

local/php_interface/init.php:

<?php
use Bitrix\Main\EventManager;

$eventManager = EventManager::getInstance();
$eventManager->addEventHandler('main', 'OnBeforeUserRegister', ['CustomHandlers', 'replaceLoginWithEmail']);
$eventManager->addEventHandler('main', 'OnBeforeUserUpdate', ['CustomHandlers', 'replaceLoginWithEmail']);

local/lib/CustomHandlers.php:

<?php
class CustomHandlers
{
    public static function replaceLoginWithEmail(array &$fields)
    {
        if (!empty($fields["EMAIL"])) {
            $fields["LOGIN"] = $fields["EMAIL"];
        }
        return $fields;
    }
}

4. Адаптация шаблонов

result_modifier.php:

<?php
// Кастомный порядок полей
$arResult['SHOW_FIELDS'] = [
    'EMAIL',
    'NAME',
    'LAST_NAME',
    'PERSONAL_PHONE',
    'WORK_COMPANY',
    'PERSONAL_STREET',
    'PASSWORD',
    'CONFIRM_PASSWORD'
];

Перенаправление авторизованных пользователей:

<?php if ($USER->IsAuthorized()): ?>
    <script>window.location.href = "/personal/";</script>
    <?php return; ?>
<?php endif; ?>

5. Замена системного компонента

auth/register.php:

<?
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php");
$APPLICATION->SetTitle("Регистрация");

// Заменяем стандартный компонент
$APPLICATION->IncludeComponent("custom:main.register", "flat", [...], false);

require($_SERVER["DOCUMENT_ROOT"]."/bitrix/footer.php");

6. Обновление системных компонентов

Авторизация (system.auth.authorize):

// local/templates/.default/components/bitrix/system.auth.authorize/.default/lang/ru/template.php
$MESS['SYS_AUTH_AUTHORIZE_LOGIN'] = 'E-mail';

Восстановление пароля (system.auth.forgotpasswd):

// template.php
<?php
// Удаляем поле логина
unset($arResult['SHOW_FIELDS']['USER_LOGIN']);

Смена пароля (system.auth.changepasswd):

// template.php
<?php
// Фикс сообщения об ошибке
if (isset($arParams['AUTH_RESULT']['MESSAGE'])) {
    $message = str_replace(
        "Логин должен быть не менее 3 символов", 
        "Неверный формат E-mail", 
        $arParams['AUTH_RESULT']['MESSAGE']
    );
    ShowMessage($message);
}

Ключевые технические решения

  1. Автоматическая привязка E-mail к логину

    • Обработчики OnBeforeUserRegister/OnBeforeUserUpdate
    • Гарантированная синхронизация полей
  2. Безопасность паролей

    // component.php
    if ($arParams["AUTH"] == "Y") {
       $USER->Authorize($USER_ID, false, true);
    }
    • Автоматическая авторизация после регистрации
    • Безопасное хранение сессий
  3. Валидация данных

    // Обработка уникальности E-mail
    if (CUser::GetByLogin($fields["EMAIL"])->Fetch()) {
       $arResult["ERRORS"][] = "Пользователь с таким E-mail уже существует";
    }
  4. Многоязычная поддержка

    // lang/ru/component.php
    $MESS['CUSTOM_REGISTER_EMAIL_TITLE'] = 'Адрес электронной почты';

Оптимизация производительности

  1. Кеширование компонента

    $this->setResultCacheKeys(["SHOW_FIELDS", "AUTH_RESULT"]);
  2. AJAX-обработка

    // template.js
    BX.ajax.submit(componentForm, (response) => {
       if (response.errors) {
           // Обработка ошибок
       } else {
           window.location.href = "/personal/";
       }
    });
  3. Валидация на клиенте

    <input 
       type="email" 
       name="EMAIL" 
       required 
       pattern="[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}$"
    >

Решение распространенных проблем

Проблема: Конфликт с существующими пользователями\ Решение: Проверка уникальности перед регистрацией

if (CUser::GetByLogin($email)->Fetch()) {
    $APPLICATION->ThrowException("E-mail уже используется");
    return false;
}

Проблема: Неправильная кодировка писем\ Решение: Явное указание кодировки

$eventManager->addEventHandler("main", "OnBeforeEventSend", function(&$fields) {
    $fields["CONTENT_TYPE"] = "text/html; charset=UTF-8";
});

Проблема: Потеря данных при кастомизации\ Решение: Сохранение пользовательских свойств

$user = new CUser;
$user->Update($ID, [
    "UF_CUSTOM_FIELD" => $_POST["CUSTOM_FIELD"]
]);

Данная реализация обеспечивает:

  1. Единую точку входа через E-mail
  2. Соответствие требованиям GDPR
  3. Поддержку сложных сценариев регистрации
  4. Интеграцию с CRM и маркетинговыми системами
  5. Масштабируемость для высоконагруженных проектов

Для enterprise-решений рекомендуется:

  • Добавить двухфакторную аутентификацию
  • Реализовать верификацию E-mail
  • Интегрировать с системами антифрода
  • Настроить триггеры для маркетинговых коммуникаций