Php – yii2 перенаправление на предыдущую страницу после входа в систему –

Php – yii2 перенаправление на предыдущую страницу после входа в систему –

Привет, мир!

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

Yii::$app->request->getReferrer(); // printing the refferrer url to screen 
$this->redirect(Yii::$app->request->referrer)


 return Yii::$app->getResponse()->redirect(Yii::$app->getUser()->getReturnUrl($defaultUrl));

Ничего из вышеперечисленного не работает

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

        /** @var LoginForm $model */
        $model = Yii::createObject(LoginForm::className());
        $event = $this->getFormEvent($model);

        $this->performAjaxValidation($model);
       $baseurl = Yii::$app->request->getAbsoluteUrl();
        $this->trigger(self::EVENT_BEFORE_LOGIN, $event);

        if ($model->load(Yii::$app->getRequest()->post()) && $model->login()) {
            $this->trigger(self::EVENT_AFTER_LOGIN, $event);
           // return $this->redirect(Yii::$app->request->referrer);
          //  return Yii::$app->getResponse()->redirect(Yii::$app->getUser()->getReturnUrl($defaultUrl));
           // return Yii::$app->request->getReferrer(); // printing the refferrer url to screen :(!!
           return $this->redirect($baseurl);
         // return $this->redirect(Yii::$app->request->referrer);; //this one is returning everthing to main page, because of line 147
          //  return $this->goBack();
        }

        return $this->render('login', [
            'model'  => $model,
            'module' => $this->module,
        ]);
    }

В конфигурации web.php у меня есть это:

$config =[ 
..//
'modules' => [
        'user' => [
            'class' => 'dektriumuserModule',
            'enableUnconfirmedLogin' => true,
            'confirmWithin' => 21600,
            'cost' => 12,
            'enableFlashMessages' => true,
            'admins' => ['a'],
        ],
    //..

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

После 4 часов попыток я попытался “Echo” URL после запроса реферера; реферер работает нормально, проблема в том, что после входа в систему страница загружается более одного раза, и вот проблема в том, что он не отправляет обратно на эту страницу, а отправляет людей на текущую страницу (страницу входа), тогда, если он является пользователем, он автоматически отправка домой.

Лучший ответ

Я сделал это с помощью @serghei Leonenco,
но у меня были эти проблемы:
1. Страница перезагружалась после нажатия кнопки «Отправить», чтобы реферал всегда был страницей входа, и поэтому он продолжал посылать пользователей на главную страницу.
2. Я должен был получить рекомендацию до начала формы. 3. Мне пришлось передать значение реферера на скрытый ввод. 4. Я должен был проверить, пришел ли реферал с моего сайта или гость попал на страницу входа со стороннего сайта. 5. Передал значение после проверки, использовал redirect и Url :: to (‘link’, true), потому что значение, которое я получил от referrer, было полным URL, и я не мог просто перенаправить на полную ссылку, поэтому я использовал Url :: to с истинным условием, которое означает создание нового URL.
< Сильный > Вид
Обратите внимание, что я использовал значение реферера перед формой.

<div class="panel-body arab">
                **<?php $referer = Yii::$app->request->referrer;?>**
                <?php $form = ActiveForm::begin([
                    'id' => 'login-form',
                    'enableAjaxValidation' => true,
                    'enableClientValidation' => false,
                    'validateOnBlur' => false,
                    'validateOnType' => false,
                    'validateOnChange' => false,
                ]) ?>
                **<?= $form->field($model, 'referer')->hiddenInput(['value' => $referer])->label(false) ?>**
                <?php if ($module->debug): ?>
                    <?= $form->field($model, 'login', [
                        'inputOptions' => [
                            'autofocus' => 'autofocus',
                            'class' => 'form-control',
                            'tabindex' => '1']])->dropDownList(LoginForm::loginList());
                    ?>

                <?php else: ?>

                    <?= $form->field($model, 'login',
                        ['inputOptions' => ['autofocus' => 'autofocus', 'class' => 'form-control', 'tabindex' => '1']]
                    );
                    ?>

                <?php endif ?>

                <?php if ($module->debug): ?>
                    <div class="alert alert-warning">
                        <?= Yii::t('user', 'Password is not necessary because the module is in DEBUG mode.'); ?>
                    </div>
                <?php else: ?>
                    <?= $form->field(
                        $model,
                        'password',
                        ['inputOptions' => ['class' => 'form-control', 'tabindex' => '2']])
                        ->passwordInput()
                        ->label(
                            Yii::t('user', 'Password')
                            . ($module->enablePasswordRecovery ?
                                ' (' . Html::a(
                                    Yii::t('user', 'Forgot password?'),
                                    ['/user/recovery/request'],
                                    ['tabindex' => '5']
                                )
                                . ')' : '')
                        ) ?>
                <?php endif ?>

                <?= $form->field($model, 'rememberMe')->checkbox(['tabindex' => '3']) ?>

                <?= Html::submitButton(
                    Yii::t('user', 'Sign in'),
                    ['class' => 'btn btn-success btn-block', 'tabindex' => '4']
                ) ?>

                <?php ActiveForm::end(); ?>

< Сильный > Model
Обратите внимание, что я использовал regex, чтобы убедиться, что пользователь попал на страницу входа, используя мой веб-сайт.

public function getReferer()
    {
        $getLink = Yii::$app->request->post('login-form')['referer'];
        if(preg_match('/tajrobtak/', $getLink)){
        return $getLink;
        } else {
        return "";
        }
    }

< Сильный > контроллер

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

        /** @var LoginForm $model */
        $model = Yii::createObject(LoginForm::className());
        $referery = $model->getReferer();
        $event = $this->getFormEvent($model);

        $this->performAjaxValidation($model);

        $this->trigger(self::EVENT_BEFORE_LOGIN, $event);

        if ($model->load(Yii::$app->getRequest()->post()) && $model->login()) {
            $this->trigger(self::EVENT_AFTER_LOGIN, $event);
            $this->redirect(Url::to($referery,true));
        }

        return $this->render('login', [
            'model'  => $model,
            'module' => $this->module,
        ]);
    }

и это все работает Отлично!
Удачного кодирования!

Эта проблема является общей, и она связана с тем, что во время публикации логина ваш реферальный адрес – это страница логина – actionLogin(), поэтому вы будете перенаправлены обратно, и, конечно же, вас проинформируют условие, что вы не Guest. Чтобы справиться с этим, вы должны назначить реферер модальному полю, чтобы его можно было опубликовать вместе с информацией для входа. Таким образом, в то время, когда логин подтвержден, у вас есть необходимый URL-адрес реферера в вашем поле. Проверьте, указано ли это поле в вашей форме:

<?php $form = ActiveForm::begin(['id' => 'login-form']); ?>
<?= $form->field($model, 'referer')->hiddenInput()->label(false) ?>

< Сильный > контроллер

$form = new LoginForm();
//get previos viewed page url and store in the new model
$form->referer = Yii::$app->request->referrer;
if ($form->load(Yii::$app->request->post())) {
   if($form->login()){
      return $this->goBack((($form->referer) ? $form->referer : null));
   }
}

Модель LoginForm ()

public $referer;
/**
     * {@inheritdoc}
     */
    public function rules()
    {
        return [
            //...
            ['referer', 'string'],
        ];
    }

После этого, когда это будет пост-запрос, в этом поле будет содержаться реферер, который вы передадите в свой контроллер.

Далее, если вы используете модуль yii2-user, теперь можно и нужно в конфиге в controllerMap удалить все принудительные перенаправления для события «после входа в систему» (я их закомментировал):

...
'modules' => [
        'user' => [
            'class' => dektriumuserModule::className(),
            'admins' => ['adminname'],
            'enableConfirmation' => false,
            'modelMap' => [
                'User' => 'appmodelsUser',
                'UserSearch' => 'appmodelsUserSearch',
                'Profile' => 'appmodelsProfile',
            ],
            'controllerMap' => [
                'profile' => 'appcontrollersuserProfileController',
                'security' => [
                    'class' => dektriumusercontrollersSecurityController::className(),
                    'on ' . dektriumusercontrollersSecurityController::EVENT_AFTER_LOGIN => function ($e) {
                        /*if (Yii::$app->user->can('student free')) {
                            Yii::$app->response->redirect(array('/course'))->send();
                        }
                        if (Yii::$app->user->can('admin')) {
                            Yii::$app->response->redirect('http://site.ru/user/')->send();
                        }*/

                        //Yii::$app->response->redirect(Yii::$app->request->referrer)->send();
                    //    Yii::$app->response->redirect(array('/user/'.Yii::$app->user->id))->send();
                        //Yii::$app->end();
                    }
                ],
            ],
        ],
...

Отправка ответа ¶

Содержимое ответа не отправляется пользователю до вызова метода yiiwebResponse::send(). По умолчанию он вызывается
автоматически в конце метода yiibaseApplication::run(). Однако чтобы ответ был отправлен немедленно, вы можете
вызвать этот метод явно.

Для отправки ответа метод yiiwebResponse::send() выполняет следующие шаги:

Перенаправить пользователя на предыдущую страницу после авторизации (yii2)

Контроллер по умолчанию (сгенерированный) использует что-то вроде этого:

public function actions()
{
    return [
        'captcha' => [
            'class' => 'yiicaptchaCaptchaAction',
        ],
    ];
}

В вашем контроллере есть что-то подобное?

Это означает, что есть действие «капча», которое используется для отображения капчи (возвращает изображение). Когда у вас есть страница, отображающая капчу, изображение вызывается после страницы, на которую вы хотите вернуться. Следовательно, последняя посещенная страница — это страница с капчей.

Я думаю, вам нужно отфильтровать это действие.

Другой возможностью может быть использование $controller->goBack()метода по умолчанию. Я думаю, что это обрабатывает регистрацию returnUrlпо умолчанию.

Ссылка: Класс yiiwebController

Тело ответа ¶

Большинство ответов должны иметь тело, содержащее то, что вы хотите показать пользователям.

Если у вас уже имеется отформатированная строка для тела, вы можете присвоить её свойству yiiwebResponse::$content
объекта запроса:

Yii::$app->response->content = 'hello world!';

Если ваши данные перед отправкой конечным пользователям нужно привести к определённому формату, вам следует установить значения
двух свойств: format и data. Свойство format
определяет, в каком формате следует возвращать данные из data. Например:

$response = Yii::$app->response;
$response->format = yiiwebResponse::FORMAT_JSON;
$response->data = ['message' => 'hello world'];

Yii из коробки имеет поддержку следующих форматов, каждый из которых реализован классом форматтера.
Вы можете настроить эти форматтеры или добавить новые через свойство yiiwebResponse::$formatters.

Хотя тело запроса может быть явно установлено показанным выше способом, в большинстве случаев вы можете задавать его неявно
через возвращаемое значение методов действий. Типичный пример использования:

publicfunctionactionIndex(){
    return$this->render('index');
}

Действие index в коде выше возвращает результат рендеринга представления index. Возвращаемое значение будет взято
компонентом response, отформатировано и затем отправлено пользователям.

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

publicfunctionactionInfo(){
    Yii::$app->response->format = yiiwebResponse::FORMAT_JSON;
    return [
        'message' => 'hello world',
        'code' => 100,
    ];
}

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

publicfunctionactionInfo(){
    return Yii::createObject([
        'class' => 'yiiwebResponse',
        'format' => yiiwebResponse::FORMAT_JSON,
        'data' => [
            'message' => 'hello world',
            'code' => 100,
        ],
    ]);
}

Примечание: создавая собственные объекты ответов, вы не сможете воспользоваться конфигурацией компонента response,
настроенной вами в конфигурации приложения. Тем не менее, вы можете воспользоваться
внедрением зависимости, чтобы применить общую конфигурацию к вашим новым объектам ответа.

Похожее:  Личный кабинет Совет НМО: вход, регистрация, официальный сайт

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *