E-mail вместо логина при регистрации и оформлении заказа в 1C-Битрикс

Просмотров: 1754

Задача: при регистрации нового пользователя и оформлении заказа нужно убрать поле Логин и использовать электронную почту вместо него. При этом без захламления init.php и без создания собсвенных компонентов.

E-mail вместо логина при регистрации и оформлении заказа в 1C-Битрикс

Когда требуется настроить регистрацию на сайте, чтобы в качестве логина использовался адрес электронной почты пользователя, можно выполнить следующие действия без изменения самого компонента регистрации и без создания новых пространств имен.

Копирование значения поля EMAIL в поле LOGIN при помощи JavaScript

Для начала, скопируем значение поля EMAIL и вставим его в поле LOGIN при помощи JavaScript. Для этого нужно внести изменения в шаблон компонента "main.register".

Пример кода для шаблона компонента "main.register":

<? if ($FIELD == 'EMAIL') { ?>
  <input class="form-control" size="30" type="email" name="REGISTER[<?= $FIELD ?>]"
     onkeyup="document.getElementById('login-field').value = this.value"
     value="<?= $arResult["VALUES"][$FIELD] ?>"/>
<? } elseif ($FIELD == 'LOGIN') { // Скрываем поле LOGIN ?>
  <input id="login-field" size="30" type="hidden" name="REGISTER[<?= $FIELD ?>]"
     value="<?= $arResult["VALUES"][$FIELD] ?>"/>
<? } else { ?>
  <input class="form-control" size="30" type="text" name="REGISTER[<?= $FIELD ?>]"
     value="<?= $arResult["VALUES"][$FIELD] ?>"/>
<? } ?>

В данном примере, при вводе значения в поле EMAIL, оно будет автоматически копироваться в поле LOGIN с помощью атрибута onkeyup="document.getElementById('login-field').value = this.value". Обратите внимание, что поле LOGIN имеет идентификатор login-field, который используется в JavaScript для получения доступа к полю и установки его значения.

Также прячем название самого поля "Логин", тамже в шаблоне "main.register". Этот код будет отображать название поля только для полей, которые не являются полем "LOGIN":

<? if ($FIELD !== 'LOGIN') { ?>
  <label>
   <?= GetMessage("REGISTER_FIELD_" . $FIELD) ?>:
   <? if ($arResult["REQUIRED_FIELDS_FLAGS"][$FIELD] == "Y"): ?>
      <span>*</span>
   <? endif ?>
  </label>
<? } ?>

Чтобы не путать пользователей, также необходимо изменить название поля "Логин" на "E-mail" в компонентах авторизации и восстановления пароля. Для этого необходимо найти соответствующие шаблоны system.auth.form и system.auth.forgotpasswd и заменить название поля "Логин" на "E-mail".

Создание логина из полного адреса электронной почты при оформлении заказа

При оформлении заказа, когда пользователь еще не зарегистрирован и делает первый заказ, автоматически происходит регистрация и создается логин на основе указанного адреса электронной почты. По умолчанию, логин будет содержать только часть адреса до символа "@".

Для создания логина из полного адреса электронной почты нужно внести изменения в файл confirm.php шаблона оформления заказа. Вставьте следующий код:

if (!empty($arResult["ORDER"])) {
    $USER_UPD = new CUser;
    $rsUser = CUser::GetByID($arResult["ORDER"]['USER_ID']);
    $arUser = $rsUser->Fetch();
    $fields = array(
        "EMAIL" => $arUser['EMAIL'],
        "LOGIN" => $arUser['EMAIL']
    );
    $USER_UPD->Update($arResult["ORDER"]['USER_ID'], $fields);
    // Здесь вся остальная логика confirm.php
}

Этот код получает данные о пользователе, включая его адрес электронной почты, и обновляет логин пользователя, устанавливая его равным полному адресу электронной почты.

Пример использования в видеоуроке:
Авторизация, регистрация и восстановление пароля

После внесения всех этих изменений, регистрация и оформление заказа на сайте с использованием адреса электронной почты в качестве логина должны работать как ожидается, без необходимости создания собственных компонентов или изменения init.php.

Михаил Базаров 29.06.2023
На D7, обновление логина на email в confirm.php
Код
use Bitrix\Main\UserTable;

if (!empty($arResult["ORDER"])) {
    $userId = $arResult["ORDER"]['USER_ID'];
    $userFields = UserTable::getList([
        'filter' => ['ID' => $userId],
        'select' => ['EMAIL']
    ])->fetch();

    $user = new \CUser;
    $user->Update($userId, [
        'EMAIL' => $userFields['EMAIL'],
        'LOGIN' => $userFields['EMAIL']
    ]);
}
Гость 03.12.2023
Не хочу показаться занудой, но слово ЗАХЛАМЛЕНИЕ пишется через а.
Михаил Базаров 03.12.2023
Спасибо! Поправлено