Проблема с файлами cookie Zend

#zend-framework #plugins #cookies #multilingual

#zend-framework #Плагины #файлы cookie #многоязычный

Вопрос:

Я работаю над веб-приложением Zend 1.11. Я создал плагин выбора языка для переключения языка (it amp; en) в зависимости от ввода пользователя.

Это то, что у меня есть:

 class LS_Controller_Plugin_LangSelector extends Zend_Controller_Plugin_Abstract
{

public function preDispatch(Zend_Controller_Request_Abstract $request)
{


    if($request->getParam('lang'))
    {
        $lang=$request->getParam('lang');
        setcookie('lang', $lang, time()   (3600));
        echo "we just set a cookie";    
    }
    else if (isset($_COOKIE['lang']))
    {
        $lang=$_COOKIE['lang']; 
        echo $lang;
    }
    else 
    {   echo 'We are here.But I can't understand why';
        $lang='en';
        var_dump($_COOKIE);
    }

    switch(strtolower($lang))
    {
        case 'en':
            $locale="en_US";
        break;

        case 'it':
            $locale="it_IT";
        break;

        default:
            $locale="en_US";
    }

    $zl=new Zend_Locale();
    $zl->setLocale($locale);

    Zend_Registry::set('Zend_Locale',$zl);



    $translate=new Zend_Translate(
                  array(
                          'adapter' => 'gettext',
                          'content' => APPLICATION_PATH.'/configs/languages/'.$locale.'.mo',
                          'locale'  => 'en'
                      )

    );

    Zend_Registry::set('Zend_Translate',$translate);
}   

}
  

[bootstrap.php ]

 class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{

protected function _initRoutes()
{

    $frontController=Zend_Controller_Front::getInstance();
    $router=$frontController->getRouter();  
    $router->removeDefaultRoutes();
    $router->setGlobalParam('lang','en');
    $router->addRoute(
            'lang',
            new Zend_Controller_Router_Route('/:lang/:controller/:action',
            array('lang'=>':lang',
            'module'=>'default',
            'controller'=>'index',
            'action'=>'index'

            )

            )
    );


    $router->addRoute(
    'langController',
    new Zend_Controller_Router_Route('/:controller/:action',
    array(
            'module'=>'default',
            'controller'=>'index',
            'action'=>'index'
            )

    )
);

            $router->addRoute(
    'langIndex',
    new Zend_Controller_Router_Route('/:lang',
    array('lang'=>':lang',
            'module'=>'default',
            'controller'=>'index',
            'action'=>'index'
            )

    )
);

            $router->addRoute(
    'langNothing',
    new Zend_Controller_Router_Route('',
    array('lang'=>'en',
            'module'=>'default',
            'controller'=>'index',
            'action'=>'index'
            )

    )
);

}
}
  

Дело в том, что:

  • Я ввожу в свой браузер полный URL-адрес mysite.com/it/index/index и я получаю эхо: «мы просто ставим печенье»..все в порядке, я должен иметь возможность просматривать свой веб-сайт с итальянским набором файлов cookie, но я этого не делаю. Всякий раз, когда я нажимаю на ссылку (например, /index / contactus ..ссылки не указывают параметр ‘lang’!) Я перехожу на эту страницу, но она снова на английском (мне вторит сообщение: «Мы здесь. но я не могу понять почему»).

Разве файл cookie не должен быть установлен?

Ответ №1:

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

Если вы переходите на другой (вспомогательный) сайт, ваш файл cookie недействителен для этого пути и не передается. Вы должны установить для своего lang-cookie путь «/».

Смотрите Документацию setcookie ():

Путь на сервере, на котором будет доступен файл cookie. Если установлено значение ‘/’, файл cookie будет доступен во всем домене. Если установлено значение ‘/foo/’, файл cookie будет доступен только в каталоге /foo/ и во всех подкаталогах, таких как /foo/ bar/ домена. Значением по умолчанию является текущий каталог, в который устанавливается файл cookie.

Комментарии:

1. 1. Исправление так же просто, как изменение строки setcookie на setcookie('lang', $lang, time() 3600, '/');

2. После того, как я добавил, как было предложено, ‘/’ в строку setcookie, он работал отлично. Теперь (после выключения ноутбука) я экспериментирую со странным поведением, потому что setcookie установил lang-cookie = ‘значок. ico ‘но я не знаю, откуда это взялось! можете ли вы мне помочь? Я добавил свой загрузочный файл в вопрос

3. @luca это из-за вашего маршрута «lang». когда вы устанавливаете: контроллер и : действие из маршрута, www.yoursite.de/favicon.ico (который запрашивает браузер для отображения значка) сопоставляется, и для lang устанавливается значение favicon.ico. Итак, я предполагаю, что первым запросом, который сделал ваш браузер, был запрос favicon, устанавливающий для вас файл cookie с этим значением. Доказательство того, что ваш код не соответствует порядку, что показывает плохой дизайн. Возможным решением было бы удалить маршрут и просто добавить lang как обычный параметр (www.yoursite.de/some/query/string/value/lang/en )

4. На данный момент я удалил вызов favicon через htaccess, и теперь он работает.. Я должен настроить маршруты, спасибо, ты супер!