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

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

Задача: при регистрации нового пользователя и оформлении заказа нужно убрать поле Логин и использовать электронную почту вместо него. При этом без захламления 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
Спасибо! Поправлено
Александр 15.05.2024
Точно знаю что в коробе Б24+интернет магазин достачно просто отметить галкой регистрацию по email, сделать её обязательной и проводить проверку на уникальность и email будет автоматически подставляться вместо логина, даже если вы ввели логин не похожий на почту.
Возможно, подобная ситуация и в БУСе последних версий
Михаил Базаров 16.05.2024
Да, в Б-24 так оно и работает. В БУС, пока, все по старому.
Плюс, если хочется что бы пользователи могли оформлять заказ без предварительной регистрации, этот способ не подойдет.
Так как, если включено подтверждение почты, оформление заказа не откроется пока пользователь не зарегистрируется.