Битрикс. Регистрация и авторизация. Часть 2 из 3

20.07.2018

Теги: APICMSWeb-разработкаАвторизацияБитриксКомпонентРегистрацияФормаШаблонКомпонента

Возможности системного компонента регистрации довольно скромные: нет возможности добавить свои поля, сделать их обязательными для заполнения. Для реализации таких возможностей есть компонент «Настраиваемая регистрация», который позволяет настроить и разместить на сайте свою форму регистрации. В визуальном редакторе компонент расположен по пути: «Служебные • Пользователь • Настраиваемая регистрация».

Пример вызова компонента

<?php
$APPLICATION->IncludeComponent(     // Настраиваемая регистрация
    "bitrix:main.register",
    "",
    array(
        "AUTH" => "Y",              // Автоматически авторизовать пользователей
        "REQUIRED_FIELDS" => array( // Поля, обязательные для заполнения
            0 => "EMAIL",
            1 => "NAME",
            2 => "LAST_NAME",
        ),
        "SET_TITLE" => "Y",         // Устанавливать заголовок страницы
        "SHOW_FIELDS" => array(     // Поля, которые показывать в форме
            0 => "EMAIL",
            1 => "NAME",
            2 => "LAST_NAME",
        ),
        "SUCCESS_PAGE" => "",       // Страница окончания регистрации
        "USER_PROPERTY" => "",      // Показывать дополнительные свойства
        "USER_PROPERTY_NAME" => "", // Название блока пользовательских свойств
        "USE_BACKURL" => "N",       // Отправлять пользователя по обратной ссылке
    ),
    false
);
?>

Создадим страницу /auth/register.php, разместим на ней вызов компонента «Настраиваемая регистрация». В настройках компонента выберем поля, которые надо показывать:

  • [EMAIL] E-mail
  • [NAME] Имя
  • [LAST_NAME] Фамилия
  • [PERSONAL_PHONE] Телефон
  • [WORK_COMPANY] Наименование компании
  • [WORK_PHONE] Телефон (рабочий)

И укажем поля, обязательные для заполнения:

  • [EMAIL] E-mail
  • [NAME] Имя
  • [LAST_NAME] Фамилия
  • [PERSONAL_PHONE] Телефон

После этого страница /auth/register.php содержит следующий код:

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

<?php
$APPLICATION->IncludeComponent(
    "bitrix:main.register",
    ".default",
    array(
        "AUTH" => "N",
        "COMPONENT_TEMPLATE" => ".default",
        "REQUIRED_FIELDS" => array(
            0=>"EMAIL",
            1=>"NAME",
            2=>"LAST_NAME",
            3=>"PERSONAL_PHONE",
        ),
        "SET_TITLE" => "Y",
        "SHOW_FIELDS" => array(
            0=>"EMAIL",
            1=>"NAME",
            2=>"LAST_NAME",
            3=>"PERSONAL_PHONE",
            4=>"WORK_COMPANY",
            5=>"WORK_PHONE",
        ),
        "SUCCESS_PAGE" => "/auth/",
        "USER_PROPERTY" => array(),
        "USER_PROPERTY_NAME" => "",
        "USE_BACKURL" => "N"
    )
);
?>

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

И имеет такой вид:

Теперь нам надо кастомизировать форму регистрации под наш дизайн. Для этого копируем шаблон компонента:

  • откуда: bitrix/components/bitrix/main.register/templates/.default
  • куда: local/templates/.default/components/bitrix/main.register/.default

После внесения изменений получилось так:

<?
/*
 * Файл local/templates/.default/components/bitrix/main.register/.default/template.php
 */
if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die();
?>

<?php if ($USER->IsAuthorized()): /* если пользователь уже авторизован */ ?>
    <p><?= GetMessage('MAIN_REGISTER_REG_AUTH'); /* Вы зарегистрированы и авторизованы */ ?></p>
    <?php return ?>
<?php endif; ?>

<div class="bitrix-main-register">

    <h2><?= GetMessage('MAIN_REGISTER_FORM_TITLE'); /* заголовок формы */ ?></h2>

    <?php if (count($arResult["ERRORS"]) > 0): /* сообщения об ошибках при заполнении формы */ ?>
        <?php
            foreach ($arResult["ERRORS"] as $key => $error) {
                if (intval($key) == 0 && $key !== 0) {
                    $arResult["ERRORS"][$key] = str_replace(
                        "#FIELD_NAME#",
                        '«'.GetMessage('MAIN_REGISTER_'.$key).'»',
                        $error
                    );
                }
            }
            ShowError(implode("<br />", $arResult["ERRORS"]));
        ?>
    <?php elseif ($arResult["USE_EMAIL_CONFIRMATION"] === "Y"): ?>
        <p><?= GetMessage('MAIN_REGISTER_EMAIL_HELP'); /* будет отправлено письмо для подтверждения */ ?></p>
    <?php endif; ?>

    <form method="post" action="<?= POST_FORM_ACTION_URI; ?>" name="regform" enctype="multipart/form-data">

        <?php if ($arResult["BACKURL"] <> ''): ?>
            <input type="hidden" name="backurl" value="<?= $arResult["BACKURL"]; ?>" />
        <?php endif; ?>

        <?php foreach ($arResult["SHOW_FIELDS"] as $FIELD): ?>
            <?php if ($FIELD == "AUTO_TIME_ZONE" && $arResult["TIME_ZONE_ENABLED"]): /* часовой пояс */ ?>
                <!-- код удален -->
                <?php continue; ?>
            <?php endif; ?>

            <div>
                <span>
                    <?= GetMessage('MAIN_REGISTER_'.$FIELD); /* очередное поле */ ?>
                    <?php if ($arResult["REQUIRED_FIELDS_FLAGS"][$FIELD] == "Y"): ?>
                        <i>*</i> <!-- поле обязательно для заполнения -->
                    <?php endif; ?>
                </span>
                <span>
                    <?php if ($FIELD == "PASSWORD"): /* пароль */ ?>
                        <input type="password" name="REGISTER[<?= $FIELD; ?>]" value="<?= $arResult["VALUES"][$FIELD]; ?>"
                               autocomplete="off" />
                        <?php if ($arResult["SECURE_AUTH"]): /* безопасная авторизация */ ?>
                            <!-- код удален -->
                        <?php endif; ?>
                    <?php elseif ($FIELD == "CONFIRM_PASSWORD"): /* подтверждение пароля */ ?>
                        <input type="password" name="REGISTER[<?= $FIELD; ?>]" value="<?= $arResult["VALUES"][$FIELD]; ?>"
                               autocomplete="off" />
                    <?php elseif ($FIELD == "PERSONAL_GENDER"): /* пол: мужской, женский */ ?>
                        <select name="REGISTER[<?= $FIELD; ?>]">
                            <option value="">
                                <?= GetMessage('MAIN_REGISTER_USER_UNKNOWN'); ?>
                            </option>
                            <option value="M"<?= $arResult["VALUES"][$FIELD] == 'M' ? ' selected="selected"' : ''; ?>>
                                <?= GetMessage('MAIN_REGISTER_USER_MALE'); ?>
                            </option>
                            <option value="F"<?= $arResult["VALUES"][$FIELD] == 'F' ? ' selected="selected"' : ''; ?>>
                                <?= GetMessage('MAIN_REGISTER_USER_FEMALE'); ?>
                            </option>
                        </select>
                    <?php elseif (in_array($FIELD, array("PERSONAL_COUNTRY", "WORK_COUNTRY"))): /* страна проживания или работы */ ?>
                        <select name="REGISTER[<?= $FIELD; ?>]">
                        <?php foreach ($arResult["COUNTRIES"]["reference_id"] as $key => $value): ?>
                            <?php
                            $selected = ($value == $arResult["VALUES"][$FIELD]) ? ' selected="selected"' : '';
                            ?>
                            <option value="<?= $value; ?>"<?= $selected; ?>>
                                <?= $arResult["COUNTRIES"]["reference"][$key]; ?>
                            </option>
                        <?php endforeach; ?>
                        </select>
                    <?php elseif (in_array($FIELD, array("PERSONAL_PHOTO", "WORK_LOGO"))): /* личное фото */ ?>
                        <input type="file" name="REGISTER_FILES_<?= $FIELD; ?>" />
                    <?php elseif (in_array($FIELD, array("PERSONAL_NOTES", "WORK_NOTES"))): ?>
                        <textarea name="REGISTER[<?= $FIELD; ?>]">
                            <?= $arResult["VALUES"][$FIELD]; ?>
                        </textarea>
                    <?php elseif ($FIELD == "PERSONAL_BIRTHDAY"): /* дата рождения */ ?>
                        <small><?= $arResult["DATE_FORMAT"]; ?></small><br />
                        <input size="30" type="text" name="REGISTER[<?= $FIELD; ?>]"
                               value="<?= $arResult["VALUES"][$FIELD]; ?>" />
                        <?php
                        $APPLICATION->IncludeComponent(
                            'bitrix:main.calendar',
                            '',
                            array(
                                'SHOW_INPUT' => 'N',
                                'FORM_NAME' => 'regform',
                                'INPUT_NAME' => 'REGISTER[PERSONAL_BIRTHDAY]',
                                'SHOW_TIME' => 'N'
                            ),
                            null,
                            array("HIDE_ICONS"=>"Y")
                        );
                        ?>
                    <?php else: ?>
                        <input type="text" name="REGISTER[<?= $FIELD; ?>]"
                               value="<?= $arResult["VALUES"][$FIELD]; ?>" />
                    <?php endif; ?>
                </span>
            </div>
        <?php endforeach; ?>

        <?php /***** User properties *****/ ?>
        <?php if($arResult["USER_PROPERTIES"]["SHOW"] == "Y"): ?>
            <h3>
            <?=
            empty($arParams["USER_PROPERTY_NAME"]) ? GetMessage("USER_TYPE_EDIT_TAB") : $arParams["USER_PROPERTY_NAME"];
            ?>
            </h3>
            <?php foreach ($arResult["USER_PROPERTIES"]["DATA"] as $FIELD_NAME => $arUserField): ?>
                <div>
                    <span>
                        <?= $arUserField["EDIT_FORM_LABEL"]; ?>
                        <?php if ($arUserField["MANDATORY"]=="Y"): ?>
                            <i>*</i> <!-- поле обязательно для заполнения -->
                        <?php endif; ?>
                    </span>
                    <span>
                        <?php
                        $APPLICATION->IncludeComponent(
                            "bitrix:system.field.edit",
                            $arUserField["USER_TYPE"]["USER_TYPE_ID"],
                            array(
                                "bVarsFromForm" => $arResult["bVarsFromForm"],
                                "arUserField" => $arUserField,
                                "form_name" => "regform"
                                ),
                                null,
                                array("HIDE_ICONS"=>"Y")
                        );
                        ?>
                    </span>
                </div>
            <?php endforeach; ?>
        <?php endif; ?>
        <?php /***** User properties *****/ ?>

        <?php if ($arResult["USE_CAPTCHA"] == "Y"): /* использовать CAPTCHA? */ ?>
            <div class="captcha">
                <h3><?= GetMessage('MAIN_REGISTER_CAPTCHA_TITLE'); ?></h3>
                <input type="hidden" name="captcha_sid" value="<?= $arResult["CAPTCHA_CODE"]; ?>" />
                <img src="/bitrix/tools/captcha.php?captcha_sid=<?= $arResult["CAPTCHA_CODE"]; ?>"
                         width="180" height="40" alt="CAPTCHA" />
                <span>
                    <?= GetMessage('MAIN_REGISTER_CAPTCHA_HELP'); ?>
                    <i>*</i>
                </span>
                <span>
                    <input type="text" name="captcha_word" maxlength="50" value="" />
                </span>
            </div>
        <?php endif; ?>

        <div class="submit">
            <input type="submit" name="register_submit_button"
                   value="<?= GetMessage('MAIN_REGISTER_FORM_SUBMIT'); /* кнопка отправки формы */ ?>" />
        </div>

    </form>

    <p>
        <?= $arResult["GROUP_POLICY"]["PASSWORD_REQUIREMENTS"]; /* предупреждение о min длине пароля */?>
    </p>
    <p>
        <i>*</i> <?= GetMessage('MAIN_REGISTER_REQUIRED'); /* Эти поля обязательны для заполнения */ ?>
    </p>

</div>
<?php
/*
 * Файл local/templates/.default/components/bitrix/main.register/.default/lang/ru/template.php
 */
$MESS['MAIN_REGISTER_FORM_TITLE']          = 'Регистрация';
$MESS['MAIN_REGISTER_REG_AUTH']            = 'Вы зарегистрированы и успешно авторизованы.';
$MESS['MAIN_REGISTER_EMAIL_HELP']          = 'На указанный в форме e-mail придет запрос на подтверждение регистрации.';

$MESS['MAIN_REGISTER_LOGIN']               = 'Логин';
$MESS['MAIN_REGISTER_EMAIL']               = 'E-mail';
$MESS['MAIN_REGISTER_PASSWORD']            = 'Пароль';
$MESS['MAIN_REGISTER_CONFIRM_PASSWORD']    = 'Подтверждение пароля';

$MESS['MAIN_REGISTER_NAME']                = 'Имя';
$MESS['MAIN_REGISTER_SECOND_NAME']         = 'Отчество';
$MESS['MAIN_REGISTER_LAST_NAME']           = 'Фамилия';

$MESS['MAIN_REGISTER_TITLE']               = 'Обращение';

$MESS['MAIN_REGISTER_USER_UNKNOWN']        = 'Нет данных';
$MESS['MAIN_REGISTER_USER_MALE']           = 'Мужской';
$MESS['MAIN_REGISTER_USER_FEMALE']         = 'Женский';

$MESS['MAIN_REGISTER_PERSONAL_PROFESSION'] = 'Профессия';
$MESS['MAIN_REGISTER_PERSONAL_WWW']        = 'WWW-страница';
$MESS['MAIN_REGISTER_PERSONAL_ICQ']        = 'ICQ';
$MESS['MAIN_REGISTER_PERSONAL_GENDER']     = 'Пол';
$MESS['MAIN_REGISTER_PERSONAL_BIRTHDAY']   = 'Дата рождения';
$MESS['MAIN_REGISTER_PERSONAL_PHOTO']      = 'Фотография';
$MESS['MAIN_REGISTER_PERSONAL_PHONE']      = 'Телефон';
$MESS['MAIN_REGISTER_PERSONAL_FAX']        = 'Факс';
$MESS['MAIN_REGISTER_PERSONAL_MOBILE']     = 'Мобильный';
$MESS['MAIN_REGISTER_PERSONAL_PAGER']      = 'Пейджер';
$MESS['MAIN_REGISTER_PERSONAL_STREET']     = 'Улица, дом';
$MESS['MAIN_REGISTER_PERSONAL_MAILBOX']    = 'Почтовый ящик';
$MESS['MAIN_REGISTER_PERSONAL_CITY']       = 'Город';
$MESS['MAIN_REGISTER_PERSONAL_STATE']      = 'Область / край';
$MESS['MAIN_REGISTER_PERSONAL_ZIP']        = 'Почтовый индекс';
$MESS['MAIN_REGISTER_PERSONAL_COUNTRY']    = 'Страна';
$MESS['MAIN_REGISTER_PERSONAL_NOTES']      = 'Дополнительные заметки';

$MESS['MAIN_REGISTER_WORK_COMPANY']        = 'Наименование компании';
$MESS['MAIN_REGISTER_WORK_DEPARTMENT']     = 'Департамент / Отдел';
$MESS['MAIN_REGISTER_WORK_POSITION']       = 'Должность';
$MESS['MAIN_REGISTER_WORK_WWW']            = 'WWW-страница (работа)';
$MESS['MAIN_REGISTER_WORK_PHONE']          = 'Телефон (работа)';
$MESS['MAIN_REGISTER_WORK_FAX']            = 'Факс (работа)';
$MESS['MAIN_REGISTER_WORK_PAGER']          = 'Пейджер (работа)';
$MESS['MAIN_REGISTER_WORK_STREET']         = 'Улица, дом (работа)';
$MESS['MAIN_REGISTER_WORK_MAILBOX']        = 'Почтовый ящик (работа)';
$MESS['MAIN_REGISTER_WORK_CITY']           = 'Город (работа)';
$MESS['MAIN_REGISTER_WORK_STATE']          = 'Область / край (работа)';
$MESS['MAIN_REGISTER_WORK_ZIP']            = 'Почтовый индекс (работа)';
$MESS['MAIN_REGISTER_WORK_COUNTRY']        = 'Страна (работа)';
$MESS['MAIN_REGISTER_WORK_PROFILE']        = 'Направления деятельности';
$MESS['MAIN_REGISTER_WORK_LOGO']           = 'Логотип компании';
$MESS['MAIN_REGISTER_WORK_NOTES']          = 'Дополнительные заметки (работа)';

$MESS['MAIN_REGISTER_FORM_SUBMIT']         = 'Зарегистрироваться';
$MESS['MAIN_REGISTER_CAPTCHA_TITLE']       = 'Защита от автоматической регистрации';
$MESS['MAIN_REGISTER_CAPTCHA_HELP']        = 'Введите символы с картинки';
$MESS['MAIN_REGISTER_REQUIRED']            = 'Эти поля обязательны для заполнения';
<?php
/*
 * Файл local/templates/.default/components/bitrix/main.register/.default/lang/ru/component.php
 */
$MESS['REGISTER_WRONG_CAPTCHA']         = 'Неверно введено слово с картинки';
$MESS['REGISTER_FIELD_REQUIRED']        = 'Поле #FIELD_NAME# обязательно для заполнения';
$MESS['REGISTER_DEFAULT_TITLE']         = 'Регистрация нового пользователя';
$MESS['REGISTER_USER_WITH_EMAIL_EXIST'] = 'Пользователь с таким e-mail (#EMAIL#) уже существует';
$MESS['main_register_sess_expired']     = 'Ваша сессия истекла, повторите попытку регистрации';
$MESS['main_register_decode_err']       = 'Ошибка при дешифровании пароля (#ERRCODE#)';
/*
 * Файл local/templates/.default/components/bitrix/main.register/.default/style.css
 */
.bitrix-main-register {

}
    .bitrix-main-register > p {
        margin: 1em 0;
    }
        .bitrix-main-register > p > a {
            text-decoration: underline;
        }
    .bitrix-main-register > form {
        overflow: hidden;
    }
        .bitrix-main-register > form > div {
            width: 50%;
            margin-bottom: 15px;
            float: left;
            box-sizing: border-box;
        }
        .bitrix-main-register > form > div.captcha {
            border: 1px solid #ccc;
            padding: 20px 15px 15px 15px;
            position: relative;
            margin-top: 15px;
            width: 49%;
            clear: both;
        }
            .bitrix-main-register > form > div.captcha > h3 {
                position: absolute;
                top: -10px;
                font-weight: normal;
                font-size: 16px;
                background: #eee;
                padding: 0 10px;
                color: #999;
            }
            .bitrix-main-register > form > div.captcha > span:first-of-type {
                margin-top: 10px;
            }
        .bitrix-main-register > form > div:nth-of-type(even) {
            padding-left: 1%;
        }
        .bitrix-main-register > form > div:nth-of-type(odd) {
            padding-right: 1%;
        }
            .bitrix-main-register > form > div > span {
                display: block;
            }
            .bitrix-main-register > form > div > span:first-child {
                margin-bottom: 5px;
            }
                .bitrix-main-register > form > div > span > input[type="text"],
                .bitrix-main-register > form > div > span > input[type="password"],
                .bitrix-main-register > form > div > span > select,
                .bitrix-main-register > form > div > span > textarea {
                    width: 100%;
                    padding: 5px;
                    border:1px solid #ccc;
                }
            .bitrix-main-register > form > div.submit {
                float: none;
                padding-left: 0;
            }
            .bitrix-main-register > form > div.submit > input[type="submit"] {
                width: 30%;
                padding: 5px;
                background: #333;
                color: #fff;
                border: none;
                margin-top: 10px;
            }
    .bitrix-main-register i {
        font-style: normal;
        font-weight: bold;
        color: #f00;
    }

И вот что получилось в итоге:

Тут есть еще один важный момент. Что будет, если на эту страницу попадает авторизованный пользователь? Ему показывается малоинформативное сообщение, что он зарегистрирован и авторизован.

<?php if ($USER->IsAuthorized()): /* если пользователь уже авторизован */ ?>
    <p><?= GetMessage('MAIN_REGISTER_REG_AUTH'); /* Вы зарегистрированы и авторизованы */ ?></p>
    <?php return ?>
<?php endif; ?>

Есть смысл перенаправить его на страницу личного кабинета или на страницу профиля:

<?php if ($USER->IsAuthorized()): /* если пользователь уже авторизован, ему здесь делать нечего */ ?>
    <?php LocalRedirect('/auth/profile.php'); ?>
<?php endif; ?>

Пользовательские поля

Хотя Битрикс предлагает большой набор предопределенных полей, их все-таки может не хватить. Тогда остается только создавать свои поля. Это можно сделать в панели управления: «Настройки • Настройки продукта • Пользовательские поля»:

Я добавил поле «Мое поле», тип «Строка», в настройках компонента указал, что это поле надо показывать:

Теперь форма регистрации имеет вид:

Порядок полей

Для настройки порядка следования полей в форме, создадим файл local/templates/.default/components/bitrix/main.register/.default/result_modifier.php:

<?php
/*
 * Файл local/templates/.default/components/bitrix/main.register/.default/result_modifier.php
 */
if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die();
// меняем порядок следования полей
$arResult['SHOW_FIELDS'] = array(
    'NAME',
    'LAST_NAME',
    'LOGIN',
    'EMAIL',
    'PASSWORD',
    'CONFIRM_PASSWORD',
    'WORK_COMPANY',
    'WORK_PHONE',
    'PERSONAL_PHONE',
);
?>

В результате чего форма примет вид:

Авторизация по E-mail

Давайте уберем поле LOGIN, как отживший свое пережиток прошлого. Без этого поля регистрацию пользователь не пройдет, поэтому будем создавать LOGIN из EMAIL. Добавляем в init.php следующий код:

AddEventHandler("main", "OnBeforeUserRegister", "OnBeforeUserUpdateHandler");
AddEventHandler("main", "OnBeforeUserUpdate", "OnBeforeUserUpdateHandler");
function OnBeforeUserUpdateHandler(&$arFields) {
    $arFields["LOGIN"] = $arFields["EMAIL"];
    return $arFields;
}

Чтобы форма регистрации не выдавала ошибок «Не заполнено обязательное поле логин», внесем изменение в шаблон компонента:

<?php if ($FIELD == 'LOGIN'): /* логин */ ?>
    <input type="text" name="REGISTER[<?= $FIELD; ?>]"
           value="<?= uniqid('user_'); ?>" />
<?php elseif ($FIELD == "PASSWORD"): /* пароль */ ?>
    <!-- код пропущен -->
<?php elseif ($FIELD == "CONFIRM_PASSWORD"): /* подтверждение пароля */ ?>
    <!-- код пропущен -->
<?php endif; ?>

Еще раз изменим порядок следования полей в форме и сделаем поле LOGIN первым, чтобы можно было его скрыть, обратившись с помощью :first-of-type:

<?php
/*
 * Файл local/templates/.default/components/bitrix/main.register/.default/result_modifier.php
 */
if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die();
// меняем порядок следования полей
$arResult['SHOW_FIELDS'] = array(
    'LOGIN',
    'NAME',
    'LAST_NAME',
    'EMAIL',
    'PERSONAL_PHONE',
    'PASSWORD',
    'CONFIRM_PASSWORD',
    'WORK_COMPANY',
    'WORK_PHONE',
);
?>

Теперь скроем поле LOGIN:

/*
 * Файл local/templates/.default/components/bitrix/main.register/.default/style.css
 */
.bitrix-main-register {

}
/* код пропущен */
        .bitrix-main-register > form > div:first-of-type {
            display: none;
        }
/* код пропущен */
        .bitrix-main-register > form > div:nth-of-type(even) {
            padding-right: 1%;
        }
        .bitrix-main-register > form > div:nth-of-type(odd) {
            padding-left: 1%;
        }
/* код пропущен */

Но есть еще одна проблема — у нас теперь две формы регистрации с разным составом полей:

  • первая формируется системным компонентом system.auth.registration и доступна по адресу /auth/?register=yes
  • вторая формируется компонентом bitrix:main.register и доступна по адресу /auth/register.php

Давайте это исправим. Удалим весь код из шаблона компонента system.auth.registration, и поместим в него вызов компонента bitrix:main.register из файла /auth/register.php:

<?php
/*
 * Файл local/templates/.default/components/bitrix/system.auth.registration/.default/template.php
 */
if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die();

$APPLICATION->IncludeComponent(
    "bitrix:main.register",
    ".default",
    array(
        "AUTH" => "N",
        "REQUIRED_FIELDS" => array(
            0 => "EMAIL",
            1 => "NAME",
            2 => "LAST_NAME",
            3 => "PERSONAL_PHONE",
        ),
        "SET_TITLE" => "Y",
        "SHOW_FIELDS" => array(
            0 => "EMAIL",
            1 => "NAME",
            2 => "LAST_NAME",
            3 => "PERSONAL_PHONE",
            4 => "WORK_COMPANY",
            5 => "WORK_PHONE",
        ),
        "SUCCESS_PAGE" => "/auth/",
        "USER_PROPERTY" => array(
        ),
        "USER_PROPERTY_NAME" => "",
        "USE_BACKURL" => "N",
        "COMPONENT_TEMPLATE" => ".default"
    ),
    false
);

А файл /auth/register.php просто удалим. Можно еще удалить лишний код из шаблона компонента bitrix:main.register, который никогда не будет выполнен. Системный компонент system.auth.registration вызывается где-то глубоко в недрах Битрикс только в том случае, если пользователь не авторизован. И еще одна проверка в шаблоне «Пользователь авторизован?» просто не нужна.

<?php
/*
 * Файл local/templates/.default/components/bitrix/main.register/.default/template.php
 */
if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die();
?>
<!-- следующие три строчки можно удалить -->
<?php if ($USER->IsAuthorized()): /* если пользователь уже авторизован, ему здесь делать нечего */ ?>
    <?php LocalRedirect('/auth/profile.php'); ?>
<?php endif; ?>

Не забываем изменить другие системные компоненты:

<?php
/*
 * Файл local/templates/.default/components/bitrix/system.auth.authorize/.default/lang/ru/template.php
 */
$MESS['SYS_AUTH_AUTHORIZE_TITLE']         = 'Авторизация';
// теперь e-mail используется как логин
$MESS['SYS_AUTH_AUTHORIZE_LOGIN']         = 'E-mail';
$MESS['SYS_AUTH_AUTHORIZE_PASSWORD']      = 'Пароль';
$MESS['SYS_AUTH_AUTHORIZE_REMEMBER']      = 'Запомнить меня';
$MESS['SYS_AUTH_AUTHORIZE_CAPTCHA_TITLE'] = 'Защита от автоматической регистрации';
$MESS['SYS_AUTH_AUTHORIZE_CAPTCHA_TEXT']  = 'Введите символы с картинки';
$MESS['SYS_AUTH_AUTHORIZE_SUBMIT']        = 'Войти';
$MESS['SYS_AUTH_AUTHORIZE_REG_USER']      = 'Зарегистрироваться';
$MESS['SYS_AUTH_AUTHORIZE_FORGOT']        = 'Забыли пароль?';
<?php
/*
 * Файл local/templates/.default/components/bitrix/system.auth.forgotpasswd/.default/lang/ru/template.php
 */
$MESS['SYS_AUTH_FORGOT_TITLE']        = 'Восстановление пароля';
// теперь восстановление пароля только по e-mail
$MESS['SYS_AUTH_FORGOT_HELP']         = 'Введите Ваш E-mail: инструкция по смене пароля будет отправлена на этот почтовый адрес.';
$MESS['SYS_AUTH_FORGOT_LOGIN']        = 'Логин';
$MESS['SYS_AUTH_FORGOT_EMAIL']        = 'E-mail';
$MESS['SYS_AUTH_FORGOT_CAPTHA_TITLE'] = 'Защита от автоматической регистрации';
$MESS['SYS_AUTH_FORGOT_CAPTHA_TEXT']  = 'Введите символы с картинки';
$MESS['SYS_AUTH_FORGOT_SUBMIT']       = 'Отправить';
$MESS['SYS_AUTH_FORGOT_AUTH']         = 'Авторизация';
<?php
/*
 * Файл local/templates/.default/components/bitrix/system.auth.forgotpasswd/.default/template.php
 */
if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die();
?>
    <!-- логин больше не нужен, удаляем или комментируем код ниже -->
    <!--
    <div>
        <span>
            <?= GetMessage('SYS_AUTH_FORGOT_LOGIN'); /* логин пользователя */ ?>
        </span>
        <span>
            <input type="text" name="USER_LOGIN" maxlength="50" value="<?= $arResult["LAST_LOGIN"]; ?>" />
        </span>
    </div>
    -->
<?php
/*
 * Файл local/templates/.default/components/bitrix/system.auth.changepasswd/.default/lang/ru/template.php
 */
$MESS['SYS_AUTH_CHANGE_TITLE']         = 'Смена пароля';
// теперь e-mail используется как логин
$MESS['SYS_AUTH_CHANGE_LOGIN']         = 'E-mail';
$MESS['SYS_AUTH_CHANGE_CHECK']         = 'Контрольная строка';
$MESS['SYS_AUTH_CHANGE_PASSWORD']      = 'Новый пароль';
$MESS['SYS_AUTH_CHANGE_CONFIRM']       = 'Подтверждение пароля';
$MESS['SYS_AUTH_CHANGE_CAPTCHA_TITLE'] = 'Защита от автоматической регистрации';
$MESS['SYS_AUTH_CHANGE_CAPTCHA_TEXT']  = 'Введите символы с картинки';
$MESS['SYS_AUTH_CHANGE_SUBMIT']        = 'Изменить пароль';
$MESS['SYS_AUTH_CHANGE_AUTH']          = 'Авторизация';
$MESS['SYS_AUTH_CHANGE_REQUIRED']      = 'Эти поля обязательны для заполнения';

Есть еще один момент, о котором есть смысл упомянуть. Если при изменении пароля не заполнить поле «E-mail», появляется сообщение об ошибке «Логин должен быть не менее 3 символов». Где это изменить, я не нашел, видимо где-то в недрах ядра Битрикс. Поэтому небольшой хак:

<?php
/*
 * Файл local/templates/.default/components/bitrix/system.auth.changepasswd/.default/template.php
 */
if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die();
?>

<div class="system-auth-changepasswd">

<h2><?= GetMessage('SYS_AUTH_CHANGE_TITLE'); /* заголовок формы */ ?></h2>

<?php
// небольшй хак, который убирает сообщение о длине логина
if (isset($arParams['AUTH_RESULT']['TYPE'])
    && $arParams['AUTH_RESULT']['TYPE'] == 'ERROR'
    && false !== iconv_strpos($arParams['AUTH_RESULT']['MESSAGE'], 'Логин должен быть')) {
    $arParams['~AUTH_RESULT']['MESSAGE'] = 'Недопустимое значение поля «E-mail»';
}
?>

<p><?php ShowMessage($arParams["~AUTH_RESULT"]); /* сообщение о результате смены пароля */ ?></p>

Поиск: CMS • Web-разработка • Авторизация • Битрикс • Компонент • Регистрация • Форма • Шаблон компонента

Каталог оборудования
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Производители
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Функциональные группы
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.