Несколько языков в выпечке CakePHP - не удается войти в систему для работы - PullRequest
0 голосов
/ 18 июля 2011

Я следовал этому руководству, чтобы создать многоязычный сайт. http://nuts -and-bolts-of-cakephp.com / 2008/11/28 / CakePHP-URL-ориентированный язык переключение для-i18n-и-l10n-интернационализация и локализация /

Однако, хотя я могу попасть на страницу входа в систему 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/ в URL.

Кто-нибудь может помочь? Я предоставлю любой необходимый код.

Ответы [ 4 ]

1 голос
/ 30 июля 2011

Это было довольно путешествие, чтобы заставить его работать.Некоторые из вещей, которые я до сих пор не понимаю, но, по крайней мере, я знаю, что они работают.Если вы улучшите это, дайте мне знать, я хотел бы знать об этом.

Этот урок в вопросе только дает вам половину пути.

Кроме того, вот несколько вещей, которые необходимо изменить, чтобы это работало:

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 pp

1 голос
/ 28 октября 2011

Я использовал тот же ресурс, чтобы сделать 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'));
0 голосов
/ 07 января 2013

Одна вещь, которая помогла мне (не идеально, но это начало)

- я создал исключения для 'loginPage' (действие входа в систему для автокомпонента)

, поэтому языкURL не заполняется при входе в систему.

это помогло мне, так как я не мог войти в систему, пока не сделал это

я добавил это в app_helper.php

>     //exceptions to allow to login
>     if (isset($url['action'])) {
>          if ($url['action'] == 'loginPage') $url['language'] = false;
>     }
0 голосов
/ 18 июля 2011

Я видел ваш другой вопрос о мультиязычности. Я собирался сказать, что просто сделайте язык по умолчанию «en». Но я не уверен, как это повлияет на SEO, поэтому я ничего не сказал. Но да, то, как вы сейчас работаете, может помешать многим автоматическим Cake, например, проблеме с аутентификацией, которая у вас возникла. Вот что я бы предложил: В 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.

...