2011-10-13 80 views
1

我正在开发一个Zend 1.11 web应用程序。我建立了一个语言选择器插件,用于根据用户输入切换语言(它为& en)。Zend cookie问题

这是我有:

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 /它/索引/指数,我得到回声“我们只是设置一个cookie”..很好,我应该能够浏览我的网站与意大利饼干集,但我没有。每当我点击一个链接(例如/index/contactus..links不指定'lang'参数!)我导航到该页面,但它再次用英语(我得到回应消息:“我们在这里但是我不明白为什么“)。

不应该设置cookie吗?

回答

2

问题是,您没有为您的cookie指定路径。所以它只会设置为当前页面

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

setcookie()文档:

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

+0

+1。解决方法与将setcookie行更改为'setcookie('lang',$ lang,time()+ 3600,'/');' –

+0

这样简单:在我按照建议在setcookie行中添加'/'后,完美。 现在(笔记本电脑关机后)我正在尝试奇怪的行为导致setcookie设置lang-cookie ='favicon.ico',但我不知道这是从哪里来的!你可以帮我吗?我在问题 – luca

+2

@luca中添加了自举文件,这是因为你的“lang”路由。当您设置:controller和:来自路由的action时,www.yoursite.de/favicon.ico(浏览器显示favicon的请求)被匹配,并且lang被设置为favicon.ico。所以我猜想,您的浏览器发出的第一个请求是favicon请求,并为您设置了一个具有该值的cookie。证明你的代码不符合订单证明,表明设计不好。一个可能的解决办法是删除路由,并将lang添加为常规参数(www.yoursite.de/some/query/string/value/lang/en) – breiti