Авторизация по коду из Email письма

Кастомизация регистрации

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

Серверная сторона

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

А на событие непосредственно перед добавление пользователя повторно проверяем поля, так как пользователь мог их изменить и можем добавить какие то служебные данные, которые сохранятся в профиль пользователя битрикса

if(\Bitrix\Main\Loader::includeModule('bxmaker.authuseremail'))
    {
        $eventManager = \Bitrix\Main\EventManager::getInstance();

        $eventManager->addEventHandler(
            "bxmaker.authuseremail",
            "EVENT_REGISTER_CHECK",
            "bxmaker_authuseremail_event_register_check"
        );

        $eventManager->addEventHandler(
            "bxmaker.authuseremail",
            "EVENT_REGISTER",
            "bxmaker_authuseremail_event_register"
        );


        /**
         * Проверка заполнености обязательных полей,
         * если нет заполнено нужно выбросить исключение с заданым кодом,
         * чтобы переключить отображение на блок с полями
         * @throws \Bxmaker\AuthUserEmail\Exception\BaseException
         */
        function bxmaker_authuseremail_event_register_check()
        {
            $req = \Bitrix\Main\Application::getInstance()->getContext()->getRequest();
            $work = $req->getPost('work');

            if(is_null($work) || strlen(trim($work)) < 4)
            {
                throw new \Bxmaker\AuthUserEmail\Exception\BaseException(
                    'Необходмио указать место работы',
                    'BXMAKER_AUTHUSERPHONE_ERROR_INVALID_FIELD', //код обязательно такой
                    [
                        'FIELD' => 'work'
                    ]
                );
            }
        }

        /**
         * Проверка полей непосредственно перед регистрацией пользователя
         * или заполнение какими то служебными данными и тп
         * @param $arFields
         * @throws \Bxmaker\AuthUserEmail\Exception\BaseException
         */
        function bxmaker_authuseremail_event_register(&$arFields)
        {
            $req = \Bitrix\Main\Application::getInstance()->getContext()->getRequest();
            $work = $req->getPost('work');

            // можно проверить на соответствие полей
            if(is_null($work) || strlen(trim($work)) < 4)
            {
                throw new \Bxmaker\AuthUserEmail\Exception\BaseException(
                    'Необходмио указать место работы',
                    'BXMAKER_AUTHUSERPHONE_ERROR_INVALID_FIELD',
                    [
                        'FIELD' => 'work'
                    ]
                );
            }

            $arFields['WORK_COMPANY'] = trim($work);
        }


    }

Клиентская сторона

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

BX.Vue.mutateComponent('BxmakerAuthuseremailLoginRegistrationFields',
    {
        data: function() {
            return {
                work :'',
            }
        },
        methods: {
            onInputWork: function(value) {
                this.setExpandField('work', value);
            },
        },
        watch:{
            expandFields: function(val){
                this.work = val.work ? val.work : '';
            }
        },
        template: '
	    <div>
		<BxmakerAuthuseremailInput 
                    title="Работа" 
                    :value="work" 
                    @onInput="onInputWork" 
                    :name="work" 
                />      
            </div>
		'
    });

Переносим созданный файл в шаблон сайта в директорию {путь до шаблона сайта}/js/vue/ и подключаем в шапке сайта (*файл header.php*) например так

$Asset = \Bitrix\Main\Page\Asset::getInstance();
$Asset->addJs(SITE_TEMPLATE_PATH . '/js/vue/bxmaker.authuseremail.js');

И смотрим результат: 2021-10-12_19-44.png