Архитектурный подход
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);
}
Ключевые технические решения
-
Автоматическая привязка E-mail к логину
- Обработчики OnBeforeUserRegister/OnBeforeUserUpdate
- Гарантированная синхронизация полей
-
Безопасность паролей
// component.php if ($arParams["AUTH"] == "Y") { $USER->Authorize($USER_ID, false, true); }- Автоматическая авторизация после регистрации
- Безопасное хранение сессий
-
Валидация данных
// Обработка уникальности E-mail if (CUser::GetByLogin($fields["EMAIL"])->Fetch()) { $arResult["ERRORS"][] = "Пользователь с таким E-mail уже существует"; } -
Многоязычная поддержка
// lang/ru/component.php $MESS['CUSTOM_REGISTER_EMAIL_TITLE'] = 'Адрес электронной почты';
Оптимизация производительности
-
Кеширование компонента
$this->setResultCacheKeys(["SHOW_FIELDS", "AUTH_RESULT"]); -
AJAX-обработка
// template.js BX.ajax.submit(componentForm, (response) => { if (response.errors) { // Обработка ошибок } else { window.location.href = "/personal/"; } }); -
Валидация на клиенте
<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"]
]);
Данная реализация обеспечивает:
- Единую точку входа через E-mail
- Соответствие требованиям GDPR
- Поддержку сложных сценариев регистрации
- Интеграцию с CRM и маркетинговыми системами
- Масштабируемость для высоконагруженных проектов
Для enterprise-решений рекомендуется:
- Добавить двухфакторную аутентификацию
- Реализовать верификацию E-mail
- Интегрировать с системами антифрода
- Настроить триггеры для маркетинговых коммуникаций
