Привет, мир!
Так вот в чем дело, я пытаюсь перенаправить пользователей после входа в систему на предыдущую страницу, но это не работает .. я пытался использовать все это:
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();
}
],
],
],
...