Странное поведение cookies в IE (11) [решено]

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Аватара пользователя
girmate
Сообщения: 1534
Зарегистрирован: 2015.10.27, 12:52

Странное поведение cookies в IE (11) [решено]

Сообщение girmate »

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

if (($cookie = Yii::$app->request->cookies->get('language')) !== null) {
            $this->language = $cookie->value;
        }
В хроме работает, если cookies нету - то шагает дальше по коду.
В IE (11 версия) в $this->language попадает $lang при неустановленных куках (не переменная $lang, а текст "$lang"). Что это значит?
Последний раз редактировалось girmate 2017.03.05, 05:15, всего редактировалось 1 раз.
Осторожно! Вы общаетесь с новичком ;)
Аватара пользователя
girmate
Сообщения: 1534
Зарегистрирован: 2015.10.27, 12:52

Re: Странное поведение cookies в IE (11)

Сообщение girmate »

В общем, что-то с настройками браузера. Куки не ставятся и не читаются.
Осторожно! Вы общаетесь с новичком ;)
Аватара пользователя
girmate
Сообщения: 1534
Зарегистрирован: 2015.10.27, 12:52

Re: Странное поведение cookies в IE (11)

Сообщение girmate »

Пока сделал проверку того, что язык из куки есть в списке разрешенных:

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

 if ($this->language = Yii::$app->session->get('language')) {
            if (!$this->isValidLanguage($this->language)) {
                $this->language = 'en';
            }
Но это костыль. Почему браузер пишет "$lang" - не понятно. В хроме все замечательно работает.
Осторожно! Вы общаетесь с новичком ;)
Аватара пользователя
mat.twg
Сообщения: 222
Зарегистрирован: 2012.02.22, 20:44
Откуда: Санкт-Петербург

Re: Странное поведение cookies в IE (11)

Сообщение mat.twg »

Язык лучше через GET делать... примеров миллион... microsoft.com - не сочтите за рекламу :mrgreen:
Аватара пользователя
girmate
Сообщения: 1534
Зарегистрирован: 2015.10.27, 12:52

Re: Странное поведение cookies в IE (11)

Сообщение girmate »

Все, что меняет состояние системы лучше делать через POST.
Иначе кто-нибудь пришлет картинку со ссылкой смены языка на китайский. Примеров миллион. Но топик не об этом.
Осторожно! Вы общаетесь с новичком ;)
Аватара пользователя
mat.twg
Сообщения: 222
Зарегистрирован: 2012.02.22, 20:44
Откуда: Санкт-Петербург

Re: Странное поведение cookies в IE (11)

Сообщение mat.twg »

girmate писал(а): 2017.03.04, 20:48 Все, что меняет состояние системы лучше делать через POST.
Иначе кто-нибудь пришлет картинку со ссылкой смены языка на китайский. Примеров миллион. Но топик не об этом.
мда... вы что-то не улавливаете, однозначно...

псы: картинки (в чистом виде) вообще к интернационализации отношения не имеют.... но вы правы! Мучайтесь дальше...
Аватара пользователя
girmate
Сообщения: 1534
Зарегистрирован: 2015.10.27, 12:52

Re: Странное поведение cookies в IE (11)

Сообщение girmate »

mat.twg писал(а): 2017.03.04, 21:04
girmate писал(а): 2017.03.04, 20:48 Все, что меняет состояние системы лучше делать через POST.
Иначе кто-нибудь пришлет картинку со ссылкой смены языка на китайский. Примеров миллион. Но топик не об этом.
мда... вы что-то не улавливаете, однозначно...

псы: картинки (в чистом виде) вообще к интернационализации отношения не имеют.... но вы правы! Мучайтесь дальше...
Специально для вас не поленился и нашел конференцию Александра Макарова https://youtu.be/_i1d9M40-qc?t=478, где он говорит про GET|POST и поймете при чем тут картинки.

И во-вторых, причем тут POST|GET? Вы тему топика прочли? У меня куки не читаются в IE! А язык я меняю успешно через POST.
Осторожно! Вы общаетесь с новичком ;)
Аватара пользователя
mat.twg
Сообщения: 222
Зарегистрирован: 2012.02.22, 20:44
Откуда: Санкт-Петербург

Re: Странное поведение cookies в IE (11)

Сообщение mat.twg »

Вы слышали звон, но не знаете где он...
Аватара пользователя
girmate
Сообщения: 1534
Зарегистрирован: 2015.10.27, 12:52

Re: Странное поведение cookies в IE (11)

Сообщение girmate »

Подключил в конфиге поведение:

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

'as beforeRequest' => ['class' =>'frontend\components\setLanguageBehavior'],
Создал само поведение:

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

<?php

namespace frontend\components;

use Yii;
use yii\base\Behavior;

class setLanguageBehavior extends Behavior
{

    public $language = null;

    public function events()
    {
        return [\yii\web\Application::EVENT_BEFORE_REQUEST => 'setLanguage'];
    }

    public function setLanguage()
    {
        if ($this->language = Yii::$app->session->get('language')) {
            if (!$this->isValidLanguage($this->language)) {
                $this->language = 'en';
            }
        } elseif (Yii::$app->request->cookies->has('language')) {
            if (!$this->isValidLanguage($this->language)) {
                $this->language = 'en';
            }
        } else { // из браузера
            $this->language = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);
            if (!$this->isValidLanguage($this->language)) {
                $this->language = 'en';
            }
        }
        Yii::$app->language = $this->language;
    }

    private function isValidLanguage($lang)
    {
        if (array_key_exists($lang, Yii::$app->params['languages'])) {
            return true;
        }
    }
}
В контроллере site/language создал экшен

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

public function actionLanguage($lang)
    {
        if (!array_key_exists($lang, Yii::$app->params['languages'])) {
            $lang = 'en';
        }
        Yii::$app->session->set('language', $lang);
        Yii::$app->response->cookies->add(new \yii\web\Cookie([
            'name' => 'language',
            'value' => '$lang',
            'expire' => time() + 86400 * 365, // установить на год
        ]));
        return $this->goBack();
    }
В хроме работает, в IE не работает, потому что if ($this->language = Yii::$app->session->get('language')) почему-то ==="$lang"
Последний раз редактировалось girmate 2017.03.04, 21:31, всего редактировалось 1 раз.
Осторожно! Вы общаетесь с новичком ;)
Аватара пользователя
girmate
Сообщения: 1534
Зарегистрирован: 2015.10.27, 12:52

Re: Странное поведение cookies в IE (11)

Сообщение girmate »

mat.twg писал(а): 2017.03.04, 21:28 Вы слышали звон, но не знаете где он...
Советом можете помочь?
Осторожно! Вы общаетесь с новичком ;)
Аватара пользователя
girmate
Сообщения: 1534
Зарегистрирован: 2015.10.27, 12:52

Re: Странное поведение cookies в IE (11)

Сообщение girmate »

Нет, теперь и хром сломался - та же беда, если сделать logout(). Почему-то все ломается. Но кажется понял в чем дело. Что-то не то я в условиях написал (в поведении). Непонятно с чем сравниваю.
Осторожно! Вы общаетесь с новичком ;)
Onotole
Сообщения: 1808
Зарегистрирован: 2012.12.24, 12:49

Re: Странное поведение cookies в IE (11)

Сообщение Onotole »

beforeRequest это событие а не поведение
Аватара пользователя
girmate
Сообщения: 1534
Зарегистрирован: 2015.10.27, 12:52

Re: Странное поведение cookies в IE (11)

Сообщение girmate »

Вкралась глупая ошибка, на которую я упорно не обращал внимание.

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

 Yii::$app->response->cookies->add(new \yii\web\Cookie([
            'name' => 'language',
            'value' => '$lang',
            'expire' => time() + 86400 * 365, // установить на год
        ]));
'$lang' был в кавычках, поэтому и писал туда "$lang". Нет бы сразу перепроверить, ведь чудес не бывает...

Всем спасибо.
Последний раз редактировалось girmate 2017.03.05, 05:15, всего редактировалось 1 раз.
Осторожно! Вы общаетесь с новичком ;)
Аватара пользователя
girmate
Сообщения: 1534
Зарегистрирован: 2015.10.27, 12:52

Re: Странное поведение cookies в IE (11)

Сообщение girmate »

Onotole писал(а): 2017.03.04, 23:12 beforeRequest это событие а не поведение
Но если я правильно понимаю, я на определенное событие вешаю свое поведение. Или не так? Можно, конечно, ограничиться и просто обычной функцией на тоже событие. Не знаю как лучше. Делал по образцу.
Осторожно! Вы общаетесь с новичком ;)
Nerf
Сообщения: 780
Зарегистрирован: 2015.01.29, 00:37

Re: Странное поведение cookies в IE (11) [решено]

Сообщение Nerf »

girmate писал(а): 2017.03.04, 21:31
mat.twg писал(а): 2017.03.04, 21:28 Вы слышали звон, но не знаете где он...
Советом можете помочь?
Тут кратко и понятно, что делают POST\GET.
Тут сухо и скучно. Но первоисточник.
Вся соль:
In particular, the convention has been established that the GET and HEAD methods SHOULD NOT have the significance of taking an action other than retrieval. These methods ought to be considered "safe". This allows user agents to represent other methods, such as POST, PUT and DELETE, in a special way, so that the user is made aware of the fact that a possibly unsafe action is being requested.

Naturally, it is not possible to ensure that the server does not generate side-effects as a result of performing a GET request; in fact, some dynamic resources consider that a feature. The important distinction here is that the user did not request the side-effects, so therefore cannot be held accountable for them.
Если у вас в url язык, то это значит, что нужно отдать контент с заданным языком. Но я и сам не понял, как можно говорить, что лучше через GET, не зная кейсов... Если вам так удобнее, делайте так.
Аватара пользователя
girmate
Сообщения: 1534
Зарегистрирован: 2015.10.27, 12:52

Re: Странное поведение cookies в IE (11) [решено]

Сообщение girmate »

Оставлю для себя вариант, на котором остановился:

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

<?php

namespace frontend\components;

use Yii;
use yii\base\Behavior;

class setLanguageBehavior extends Behavior
{

    public $language = null;

    public function events()
    {
        return [\yii\web\Application::EVENT_BEFORE_REQUEST => 'setLanguage'];
    }

   public function setLanguage()
    {
        if ($this->language = Yii::$app->session->get('language')) {
        } elseif (($cookie = Yii::$app->request->cookies->get('language')) !== null) {
            $this->language = $cookie->value;
        } else { // из браузера
            $this->language = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);
        }
        if (!is_string($this->language) || !$this->isValidLanguage($this->language)) {
            $this->language = 'en';
        }
        Yii::$app->language = $this->language;
    }

    private function isValidLanguage($lang)
    {
        return array_key_exists($lang, Yii::$app->params['languages']);
    }
}
где в common/params.php

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

'languages' => [
        'en' => 'english',
        'ru' => 'русский',
    ],
в frontend/config/main.php:

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

'as beforeRequest' => ['class' =>'frontend\components\setLanguageBehavior'],
в frontend/controllers/SiteController:

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

public function actionLanguage($lang)
    {
        if (!array_key_exists($lang, Yii::$app->params['languages'])) {
            $lang = 'en';
        }
        Yii::$app->session->set('language', $lang);
        Yii::$app->response->cookies->add(new \yii\web\Cookie([
            'name' => 'language',
            'value' => $lang,
            'expire' => time() + 86400 * 365, // установить на год
        ]));
        return $this->goHome(); // $this->goBack ??
    }
Осторожно! Вы общаетесь с новичком ;)
Ответить