Авторизация в модальном окне происходит автоматически

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
yura1976
Сообщения: 134
Зарегистрирован: 2012.08.06, 13:24

Авторизация в модальном окне происходит автоматически

Сообщение yura1976 »

Здравствуйте!
Есть модальное окно с двумя табами (регистрация и авторизация). Когда кликаю в меню "Войти", открывается модалка с активной вкладкой "Войти", уже заполненными полями e-mail и пароль (значения, вводимое ранее) и почти сразу происходит авторизация, закрытие модалки и переход на главную страницу, пользователь авторизован. Как решить эти проблемы? 1) при загрузки формы авторизации не должно быть автозапонления (autocomplete=off не помогает); 2) не должно быть авоматической авторизации, она должна быть только в результате нажатия кнопки "Войти".
В файле frontend/views/layouts/main.php

Код: Выделить всё

<div class="modal fade" id="modal" tabindex="-1">
    <div class="modal-dialog">
        <div class="modal-content">
        </div>
    </div>
</div>
Ссылка "Войти":

Код: Выделить всё

<a href="<?=Url::to(['/user/auth','formtype'=>'signin'])?>" id="modal-signin-link" class="nav-link auth-link" data-toggle="modal" data-target="#modal">Войти</a>
Форма frontend/views/user/auth.php

Код: Выделить всё

.....
$formtype = Yii::$app->request->get('formtype');
?>
    <div class="modal-header align-content-between">
        <ul class="nav nav-tabs w-100 justify-content-between mr-auto ml-auto">
            <li class="nav-item w-50" id="tab1"><a class="nav-link<?=(!isset($formtype) || $formtype == 'signin')?' active':''?>" data-toggle="tab" href="#signin">Войти</a></li>
            <li class="nav-item w-50" id="tab2"><a class="nav-link<?=($formtype == 'signup')?' active':''?>" data-toggle="tab" href="#signup">Регистрация</a></li>
        </ul>
        <button type="button" class="close" data-dismiss="modal" aria-label="Close">
            <span aria-hidden="true"><img src="/images/btn_close.svg" alt="Закрыть"></span>
        </button>
    </div>
    <div class="modal-body">
    <div class="tab-content">
        <div class="alert alert-danger p-5" role="alert"></div>
        <?= Alert::widget(); ?>
        <div class="tab-pane fade show<?=(!isset($formtype) || $formtype == 'signin')?' active':''?>" id="signin">
                <?php $form = ActiveForm::begin([
                    'id' => 'login-form',
                    'class' => 'auth-form',
                    'enableAjaxValidation' => true,
                    'enableClientValidation' => true,
                    'action' => ['user/ajax-signin']
                ]); ?>
                <?= $form->field($modelsignin, 'email')
                    ->textInput([
                        'autofocus' => true,
                        'placeholder'=>$modelsignin->getAttributeLabel('email')
                    ])->label(false) ?>
                <?= $form->field($modelsignin, 'password',
                    ['errorOptions' => [
                        'encode' => false,
                    ]])
                    ->passwordInput([
                        'placeholder'=>$modelsignin->getAttributeLabel('password'),
                        'autocomplete'=>"off",
                    ])->label(false) ?>

                <?= $form->field($modelsignin, 'rememberMe')->checkbox() ?>
                <div style="color:#999;margin:1em 0">
                    <?= Html::a('Забыли пароль', ['user/request-password-reset']) ?>
                </div>

                <div class="form-group">
                    <?= Html::submitButton('Войти', [
                        'id' => 'signin-button',
                        'class' => 'btn btn-blue btn-auth w-100 p-10',
                        'name' => 'login-button'
                    ]) ?>
                </div>
                <?php ActiveForm::end(); ?>
        </div>
        <div class="tab-pane fade show<?=($formtype == 'signup')?' active':''?>" id="signup">
            <?php $form = ActiveForm::begin([
                'id' => 'signup-form',
                'class' => 'auth-form',
                'enableAjaxValidation' => true,
                'enableClientValidation' => true,
                'validationUrl' => \yii\helpers\Url::to(['validate-form']),
                'action' => ['user/ajax-signup']
            ]); ?>
            <?= $form->field($modelsignup, 'email')
                ->textInput([
                    'autofocus' => true,
                    'placeholder'=>$modelsignup->getAttributeLabel('email'),
                ])->label(false) ?>

            <?= $form->field($modelsignup, 'password')
                ->passwordInput([
                    'placeholder'=>$modelsignup->getAttributeLabel('password'),
                ])->label(false) ?>

            <?= $form->field($modelsignup, 'repassword')->passwordInput([
                'placeholder'=>$modelsignup->getAttributeLabel('repassword'),
            ])->label(false) ?>

            <?=$form->field($modelsignup, 'issubscribe')->checkbox(['checked'=>false])?>

            <?=$form->field($modelsignup, 'agree')->checkbox(['checked'=>false])->label(\common\models\Config::getConfig(7))?>

            <div class="form-group">
                <?= $form->field($modelsignup, 'check')->hiddenInput([
                    'type' => 'hidden',
                    'id' => 'check',
                    'value' => '',
                ])->label(false) ?>
                <?= Html::submitButton('Зарегистрироваться', [
                    'class' => 'btn btn-blue btn-auth w-100 pt-3 pb-3 mt-2',
                    'id' => 'signup-button',
                    'name' => 'signup-button',
                    'onclick'=>"document.getElementById('check').value = 'nospam';"
                ]) ?>
            </div>

            <?php ActiveForm::end(); ?>
        </div>
    </div>
</div>
В контроллере:

Код: Выделить всё

    public function actionAuth()
    {
        if (!Yii::$app->user->isGuest) {
            return $this->goHome();
        }

        $modelsignin = new LoginForm();
        $modelsignup = new SignupForm();

        if ($model->load(Yii::$app->request->post()) && $model->login()) {
            return $this->goBack();
        } else {
            return $this->renderAjax('auth', [
                'modelsignin' => $modelsignin,
                'modelsignup' => $modelsignup,
            ]);
        }
    }
    
    public function actionAjaxSignin()
    {
        if (Yii::$app->request->isAjax) {
            $model = new LoginForm();

            if ($model->load(Yii::$app->request->post())) {
                if ($model->login()) {
                    return $this->goBack();
                } else {
                    Yii::$app->response->format = yii\web\Response::FORMAT_JSON;
                    return \yii\widgets\ActiveForm::validate($model);
                }
            }
        } else {
            throw new HttpException(404 ,'Страница не найдена');
        }
    }
    
js:

Код: Выделить всё

    $('#modal').on('show.bs.modal', function (event) {
        var button = $(event.relatedTarget) ;
        $(this)
            .find('.modal-content')
            .load(button.attr('href'));
    });
    
   $(document).on("submit", '#signup-form', function (e) {
        e.preventDefault();
        var form = $(this);
        $.ajax({
            url: form.attr('action'),
            type: "POST",
            data: form.serialize(),
            success: function (result) {
                    var html = '<div id="success alert alert-success p-5"><strong>Спасибо за регистрацию на сайте. Для подтверждения регистрации перейдите, пожалуйста, по ссылке, которая отправлена на e-mail, указанный Вами при регистрации.</strong></div>';
                    $('.tab-content').html(html);

                    setTimeout(function() {
                        $("#modal").modal('hide');
                    }, 15000);
            },
            error: function (result) {
                var html = '<div id="success alert alert-success p-5"><strong>В данный момент невозможно зарегистрироваться. Попробуйте, пожалуйста позднее или обратитесь к администратору сайта.</strong></div>';
                $('.tab-content').html(html);
            }
        });
    });
Submit срабатывает в обход "$(document).on("submit"....". Т.е., даже если закомментить on(submit), то сразу после загрузки формы происходит post-запрос к actionAjaxSignin()
urichalex
Сообщения: 994
Зарегистрирован: 2015.08.07, 11:03

Re: Авторизация в модальном окне происходит автоматически

Сообщение urichalex »

выключить enableAjaxValidation в форме, или в действии ловить аякс запрос валидации и обрабатывать его https://www.yiiframework.com/doc/guide/ ... validation
Ответить