Ошибка при разлогинивании.

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Grazio
Сообщения: 124
Зарегистрирован: 2015.01.24, 15:31

Ошибка при разлогинивании.

Сообщение Grazio »

ВСем доброго дня, всех с праздниками!

Помогите, плз, разобраться, в чём проблема.
Мне нужно было реализовать интерфейс входа в модальном окне. Реализовал как тут написано → https://animex44.blogspot.com/2016/06/h ... up-in.html
При этом стало невозможно разлогиниться.
Когда я нажимаю на свою кнопку разлогина

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

<?= Html::a('Выход', ['/site/logout'], ['method' => 'post'])?>
То получаю вот это:

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

An Error occurred while handling another error:
exception 'yii\base\UnknownPropertyException' with message 'Setting unknown property: yii\web\ErrorAction::layout' in /var/www/html/mysite/vendor/yiisoft/yii2/base/Component.php:197
Stack trace:
#0 /var/www/html/mysite/vendor/yiisoft/yii2/BaseYii.php(521): yii\base\Component->__set('layout', 'articles')
#1 /var/www/html/mysite/vendor/yiisoft/yii2/base/Object.php(105): yii\BaseYii::configure(Object(yii\web\ErrorAction), Array)
#2 /var/www/html/mysite/vendor/yiisoft/yii2/base/Action.php(60): yii\base\Object->__construct(Array)
#3 [internal function]: yii\base\Action->__construct('error', Object(frontend\controllers\SiteController), Array)
#4 /var/www/html/mysite/vendor/yiisoft/yii2/di/Container.php(379): ReflectionClass->newInstanceArgs(Array)
#5 /var/www/html/mysite/vendor/yiisoft/yii2/di/Container.php(154): yii\di\Container->build('yii\\web\\ErrorAc...', Array, Array)
#6 /var/www/html/mysite/vendor/yiisoft/yii2/BaseYii.php(344): yii\di\Container->get('yii\\web\\ErrorAc...', Array, Array)
#7 /var/www/html/mysite/vendor/yiisoft/yii2/base/Controller.php(222): yii\BaseYii::createObject(Array, Array)
#8 /var/www/html/mysite/vendor/yiisoft/yii2/base/Controller.php(123): yii\base\Controller->createAction('error')
#9 /var/www/html/mysite/vendor/yiisoft/yii2/base/Module.php(454): yii\base\Controller->runAction('error', Array)
#10 /var/www/html/mysite/vendor/yiisoft/yii2/web/ErrorHandler.php(93): yii\base\Module->runAction('site/error')
#11 /var/www/html/mysite/vendor/yiisoft/yii2/base/ErrorHandler.php(109): yii\web\ErrorHandler->renderException(Object(yii\web\MethodNotAllowedHttpException))
#12 [internal function]: yii\base\ErrorHandler->handleException(Object(yii\web\MethodNotAllowedHttpException))
#13 {main}
Previous exception:
exception 'yii\web\MethodNotAllowedHttpException' with message 'Method Not Allowed. This url can only handle the following request methods: POST.' in /var/www/html/mysite/vendor/yiisoft/yii2/filters/VerbFilter.php:105
Stack trace:
#0 [internal function]: yii\filters\VerbFilter->beforeAction(Object(yii\base\ActionEvent))
#1 /var/www/html/mysite/vendor/yiisoft/yii2/base/Component.php(540): call_user_func(Array, Object(yii\base\ActionEvent))
#2 /var/www/html/mysite/vendor/yiisoft/yii2/base/Controller.php(269): yii\base\Component->trigger('beforeAction', Object(yii\base\ActionEvent))
#3 /var/www/html/mysite/vendor/yiisoft/yii2/web/Controller.php(108): yii\base\Controller->beforeAction(Object(yii\base\InlineAction))
#4 /var/www/html/mysite/vendor/yiisoft/yii2/base/Controller.php(152): yii\web\Controller->beforeAction(Object(yii\base\InlineAction))
#5 /var/www/html/mysite/vendor/yiisoft/yii2/base/Module.php(454): yii\base\Controller->runAction('logout', Array)
#6 /var/www/html/mysite/vendor/yiisoft/yii2/web/Application.php(100): yii\base\Module->runAction('site/logout', Array)
#7 /var/www/html/mysite/vendor/yiisoft/yii2/base/Application.php(375): yii\web\Application->handleRequest(Object(yii\web\Request))
#8 /var/www/html/mysite/frontend/web/index.php(17): yii\base\Application->run()
#9 {main}     
что за петрушка?..

p.s. пробовал ещё вот так указать кнопке метод пост:

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

<?= Html::a('Выход', ['/site/logout'], ['data-method' => 'POST'])?>
Ничего не поменялось.
p.p.s
ну я вижу, что он гетом отправляется. как так то? ))
Matvik
Сообщения: 194
Зарегистрирован: 2013.06.21, 02:32

Re: Ошибка при разлогинивании.

Сообщение Matvik »

yii.js подключается на странице?
caHek2x
Сообщения: 1240
Зарегистрирован: 2016.04.12, 20:41

Re: Ошибка при разлогинивании.

Сообщение caHek2x »

Method Not Allowed. This url can only handle the following request methods: POST
ну сделайте форму post ... и всё ...
p.s. пробовал ещё вот так указать кнопке метод пост:
у кнопки нету метода post ... это просто html:a умеет генерировать форму(или ajax не помню, не использую) ...
<?= Html::a('Выход', ['/site/logout'], ['data-method' => 'POST'])?>
а не так ?
'data' => [
'method' => 'post',
],
Onotole
Сообщения: 1808
Зарегистрирован: 2012.12.24, 12:49

Re: Ошибка при разлогинивании.

Сообщение Onotole »

caHek2x писал(а): ну сделайте форму post ... и всё ...
Костыль вместо поиска решения...
caHek2x писал(а): у кнопки нету метода post ... это просто html:a умеет генерировать форму(или ajax не помню, не использую) ...
html::a ничего, кроме тэга a не генерирует
caHek2x писал(а): а не так ?
'data' => [
'method' => 'post',
],
Без разницы
alexnew2000
Сообщения: 104
Зарегистрирован: 2015.10.04, 09:47

Re: Ошибка при разлогинивании.

Сообщение alexnew2000 »

в примере нет контроллера logout . Весь код констроллера в студию!
Onotole
Сообщения: 1808
Зарегистрирован: 2012.12.24, 12:49

Re: Ошибка при разлогинивании.

Сообщение Onotole »

alexnew2000 писал(а):в примере нет контроллера logout . Весь код констроллера в студию!
Зачем?
У товарища явно javascript не срабатывает.
Выше уже написали, что нужно делать
caHek2x
Сообщения: 1240
Зарегистрирован: 2016.04.12, 20:41

Re: Ошибка при разлогинивании.

Сообщение caHek2x »

html::a ничего, кроме тэга a не генерирует
ну значит ajax цепляется в ссылке ... ссылка же post быть не может :)
Onotole писал(а): 2017.01.08, 11:31 Костыль вместо поиска решения...
ну почему форма это костыль, форма это вполне годная альтернатива ... формы еще никто не отменял
Onotole
Сообщения: 1808
Зарегистрирован: 2012.12.24, 12:49

Re: Ошибка при разлогинивании.

Сообщение Onotole »

caHek2x писал(а): 2017.01.08, 14:50
html::a ничего, кроме тэга a не генерирует
ну значит ajax цепляется в ссылке ... ссылка же post быть не может :)
Onotole писал(а): 2017.01.08, 11:31 Костыль вместо поиска решения...
ну почему форма это костыль, форма это вполне годная альтернатива ... формы еще никто не отменял
Yii имеет встроенную возможность отправить ссылку методом POST, добавив к ссылке аттрибут data-method="post"
yii.js перехватывает такую ссылку и делает пост запрос.

Если не работает, значит, видимо, не подключен yii.js
Аватара пользователя
Sereja3578
Сообщения: 204
Зарегистрирован: 2016.09.21, 11:15
Контактная информация:

Re: Ошибка при разлогинивании.

Сообщение Sereja3578 »

Согласен. У самого через data-method реализован выход. Хотя на счет отсутствия yii.js сомневаюсь, на нем не мало повязано, вылезли бы еще, я думаю баги, плюс он же в главном ассете болтается, если его по каким-то причинам не убрали. Я бы ради интереса, чтобы проверить только ли в этом беда, отключил бы проверку на post.
Grazio
Сообщения: 124
Зарегистрирован: 2015.01.24, 15:31

Re: Ошибка при разлогинивании.

Сообщение Grazio »

Matvik писал(а): 2017.01.08, 03:55 yii.js подключается на странице?
в asset имею:

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

	public $depends = [
		'yii\web\YiiAsset',
		'yii\bootstrap\BootstrapAsset',
	];
alexnew2000 писал(а): 2017.01.08, 12:09 в примере нет контроллера logout . Весь код констроллера в студию!
Ну, логаут я вообще не трогал.

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

    /**
     * Logs out the current user.
     *
     * @return mixed
     */
    public function actionLogout()
    {
        Yii::$app->user->logout();

        return $this->goHome();
    }
А логин тупо скопировал с примера выше по ссылке из моего поста.

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

    public function actionLogin()

    {

        $model = new LoginForm();

        if (Yii::$app->request->isAjax && $model->load(Yii::$app->request->post()))
        {
            Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
            return ActiveForm::validate($model);
        }
        if ($model->load(Yii::$app->request->post()) && $model->login())
        {
            $session = Yii::$app->session;
            $session->set('username', $_POST['LoginForm']['username']);
            $session->set('password', $_POST['LoginForm']['password']);
            return $this->goHome();
        }
        else
        {
            return $this->renderAjax( 'login', [ 'model' => $model ] );
        }
        return $this->renderAjax( 'login', [ 'model' => $model ] );
    }
Onotole
Сообщения: 1808
Зарегистрирован: 2012.12.24, 12:49

Re: Ошибка при разлогинивании.

Сообщение Onotole »

Смотрите в консоль браузера
Grazio
Сообщения: 124
Зарегистрирован: 2015.01.24, 15:31

Re: Ошибка при разлогинивании.

Сообщение Grazio »

Onotole писал(а): 2017.01.08, 21:36 Смотрите в консоль браузера
Вобщем-то я туда смотрел и видел что шлётся гет запрос...
однако более вдумчивое изучение меня привело к тому, что запрос при клике по ссылке работает не напрямую (кто-то что-то прикрутил),
а его ловит жаваскрипт и далее шлёт вот такой конструкцией:

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

window.open(this.href,"_self");
Что, собственно, GET.

Спасибо всем, проблема решена :P
Onotole
Сообщения: 1808
Зарегистрирован: 2012.12.24, 12:49

Re: Ошибка при разлогинивании.

Сообщение Onotole »

Скажи нам, как решена
Grazio
Сообщения: 124
Зарегистрирован: 2015.01.24, 15:31

Re: Ошибка при разлогинивании.

Сообщение Grazio »

Решена так, что в жаваскрипте который происходит по нажатию этой ссылки, я проверяю адрес ссылки и если этот адрес совпадает с /site/logout, то я выхожу из скрипта и происходит нормальное php отрабатывание кнопки:

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

if(true == this.href.indexOf('site/logout')) {
    return;
}
Onotole
Сообщения: 1808
Зарегистрирован: 2012.12.24, 12:49

Re: Ошибка при разлогинивании.

Сообщение Onotole »

круто..
Ответить