Zend cookie问题

时间:2011-10-13 14:48:21

标签: zend-framework plugins cookies multilingual

我正在研究Zend 1.11 webapp。我根据用户输入构建了一个用于切换语言(它& 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'
            )

    )
);

}
}

重点是:

  • 我在浏览器中输入完整的网址mysite.com/it/index/index,我得到回应“我们只是设置了一个cookie”..这很好我应该可以用意大利语cookie设置浏览我的网站但我没有。每当我点击链接时(例如/index/contactus..links都没有指定'lang'参数!)我导航到那个页面但它又是英文版(我收到了消息:“我们在这里。但是我不明白为什么“)。

不应该设置cookie吗?

1 个答案:

答案 0 :(得分:2)

问题是,您没有为Cookie指定路径。因此,它仅设置为当前页面

如果您浏览到另一个(子)站点,那么您的cookie对此路径无效且无法传输。您应该将lang-cookie设置为“/”路径。

请参阅setcookie()文档:

  

可在其上使用cookie的服务器上的路径。如果设置为“/”,则cookie将在整个域中可用。如果设置为'/ foo /',则cookie只能在/ foo /目录和所有子目录中使用,例如/ foo / bar / of domain。 默认值是设置Cookie的当前目录