cakephp问题中的多种语言 - 无法登录工作

时间:2011-07-18 17:10:13

标签: authentication cakephp multilingual

我按照本教程创建了多语言网站。 http://nuts-and-bolts-of-cakephp.com/2008/11/28/cakephp-url-based-language-switching-for-i18n-and-l10n-internationalization-and-localization/

然而,虽然我尝试登录时可以到example.com/en/users/login的登录页面,但登录不会通过。我在example.com/users/login没有/en/时被抛出,我不知道这是否重要,但密码不包含4个字母/星/点,就像我试过的密码一样,但是大约40个。

另外,我注意到example.com/en/users/logout函数确实可以让我退出,但却转到example.com/users/login而不是example.com/en/users/logout

我设法弄清楚打破它的功能是:

class AppHelper extends Helper {

    function url($url = null, $full = false) {
       if(!isset($url['language']) && isset($this->params['language'])) {
           $url['language'] = $this->params['language'];
       }

       return parent::url($url, $full);
    }

}

但是,如果没有它,在URL中/en/添加方面根本没有网址可用。

有人可以帮忙吗?我将提供所需的任何代码。

4 个答案:

答案 0 :(得分:1)

这是一个让它发挥作用的旅程。我仍然没有得到的一些东西,但至少我知道它们有效。如果你对此有所改进让我知道,我想知道它。

问题中的这个教程只能让你走到一半。

此外,以下是一些需要进行调整以使其正常工作的内容:

routes.php文件:

 /**
* LANGUAGES
*/
Router::connect( '/:language/:plugin/:controller/:action/*', array(), array('language' => '[a-z]{3}')); // PLUGIN FIX
Router::connect('/:language/:controller/:action/*', array('plugin' => null), array('language' => '[a-z]{3}'));
Router::connect('/:language', array('controller'=>'static', 'plugin'=>null), array('language' => '[a-z]{3}')); 

App_controller.php:

function beforeFilter(){
    $this->_setLanguage();
    $this->Auth->logoutRedirect = array( 'controller' => 'static', 'action' => 'index', 'language'=>$this->Session->read('Config.language'));
    $this->Auth->loginRedirect = array( 'controller' => 'static', 'action' => 'dashboard', 'language'=>$this->Session->read('Config.language'));
    $this->Auth->loginAction = array( 'controller'=>'users', 'action'=>'login', 'language'=>$this->Session->read('Config.language'));
}

function _setLanguage() {
    if ($this->Cookie->read('lang') && !$this->Session->check('Config.language')) {
        // If ... don't really get this. 
        $this->Session->write('Config.language', $this->Cookie->read('lang'));
    }
    else if (isset($this->params['language']) && ($this->params['language']
             !=  $this->Session->read('Config.language'))) {
            // Had a language set, but different from the one in the URL, set to URL

        $this->Session->write('Config.language', $this->params['language']);
        $this->Cookie->write('lang',$this->params['language'], false, '360 days');
    }else{
        // First time comer
        $this->Session->write('Config.language', Configure::read('Config.language' ));
        $this->Cookie->write('lang', Configure::read('Config.language' ), false, '360 days');
    }
}

function redirect( $url, $status = NULL, $exit = true ) {
    if (!isset($url['language']) && $this->Session->check('Config.language')) {
        $url['language'] = $this->Session->read('Config.language');
    }
    parent::redirect($url,$status,$exit);
}

app_helper.php:

   function url($url = null, $full = false) {
    if(!isset($url['language']) && isset($this->params['language'])) {
      $url['language'] = $this->params['language'];
    }else if (!isset($url['language']) &&  !isset($this->params['language'])){
        if($_COOKIE['lang']){
            $url['language'] = $_COOKIE['lang'];
        }else{
            $url['language']  =  Configure::read('Config.language');
        }
     }

    return parent::url($url, $full);
}

这应该是它。希望能帮助你们所有人失去灵魂的多语种cakephp东西 第

答案 1 :(得分:1)

我使用相同的资源来制作cakephp多语言,但今天仍遇到了这个问题,默认登录操作失去了语言。当我发现这篇文章时,除了原始手册之外我唯一需要的是controller_app.php beforeFilter中的以下代码:

$this->Auth->logoutRedirect = array( 'language'=>$this->Session->read('Config.language'));
$this->Auth->loginRedirect = array( 'language'=>$this->Session->read('Config.language'));
$this->Auth->loginAction = array( 'controller'=>'users', 'action'=>'login', 'language'=>$this->Session->read('Config.language'));

答案 2 :(得分:0)

我看到了关于多语言设置的另一个问题。我打算说,只需将默认语言设为'en'即可。但我不确定这将如何影响SEO,所以我没有说什么。但是,你现在正在做的方式可能会干扰很多Cake的自动化,就像你遇到的Auth问题一样。 这就是我的建议:在app_controller中:

function beforeFilter(){
    $this->Auth->loginAction = array(
       'controller' => 'users', 
       'action' => 'login' // insert the language option that you use here
     );
    $this->Auth->logoutRedirect = array(
       'controller' => 'users', 
       'action' => 'index'
    );// you can set where to redirect after logout here
}

我建议不要重定向到/ users / logout,除非你想在那里做点什么。而且您还需要更改users_controller中的注销功能。

答案 3 :(得分:0)

有一件事对我有帮助,(不完美,但这是一个开始)

我为'loginPage'(自动组件的登录操作)

创建了例外

因此登录时不会填充网址的语言。

这帮助了我,因为直到我这样做才能登录

我将此添加到app_helper.php

>     //exceptions to allow to login
>     if (isset($url['action'])) {
>          if ($url['action'] == 'loginPage') $url['language'] = false;
>     }
相关问题