Bonjour,

Je suis en train de monter un site multi-language avec la gestion du backoffice avec ACL. Mais j'ai un petit soucis.
Dans le beforeFilter de mon app_controller j'ai une partie pour la gestion des ACL et une autre pour le i18n (suivi les tutoriels).

function beforeFilter(){
        //Configue i18nComponent
        if(!$this->Session->read('User.language')){
            $this->Session->write('User.language',Configure::read('Config.language'));
        }
        if(isset($this->params'language'])){
            if(in_array($this->params'language'],Configure::read('Config.languages'))){
                $this->Session->write('User.language',$this->params'language']);
            }
        }
        Configure::write('Config.language',$this->Session->read('User.language'));
        $this->params'language'] = $this->Session->read('User.language'); 
        if(isset($this->params'prefix']) && $this->params'prefix'] == 'admin' && $this->action != 'admin_login' && $this->action != 'admin_logout') {
            //Configure AuthComponent
            $this->Auth->authorize = 'actions';
            $this->Auth->loginAction = array('controller' => 'users', 'action' => 'login');
            $this->Auth->logoutRedirect = array('controller' => 'Dashboard', 'action' => 'admin_index');
            $this->Auth->loginRedirect = array('controller' => 'Dashboard', 'action' => 'admin_index');
        } else {
            $this->Auth->allow();

        }

    }

Le soucis est que les deux ensemble il m'est impossible de me connecter à mon back office. Si je supprimer la gestion des i18n du beforeFilter, à ce moment là, la connection remarche.

J'ai essayé de mettre des conditions mais ça marche toujours pas.
Comment je pourrais modifié ce code pour que les deux marchent ensemble.

Une autre petite question. Sur ce site le menu est en flash. Pour le moment j'ai mis deux liens dans la partie "html" pour passer du fre et eng avec ce code :

<?php echo $html->link('Français', array('language'=>'fre', 'controller' => 'homes', 'action' => 'index')); ?>
                     <?php echo $html->link('English', array('language'=>'eng', 'controller' => 'homes', 'action' => 'index')); ?>

Mais comment le faire dans du flash?

Merci d'avance

10 réponses


Davidr
Réponse acceptée

J'ai résolu mon problème en faisant ceci:

//users_controller.php
function beforeFilter() {
    //parent::beforeFilter();
    $this->Auth->authorize = 'actions';
    $this->Auth->loginAction = array('controller' => 'users', 'action' => 'login');
    $this->Auth->logoutRedirect = array('controller' => 'pages', 'action' => 'index');
    $this->Auth->loginRedirect = array('controller' => 'users', 'action' => 'admin');
    $this->Auth->authError = "No Right";
    $this->Auth->loginError = "Fail Login";
    $this->Auth->allow('login', 'logout');
}

Au lieu d'avoir

function beforeFilter() {
    parent::beforeFilter();
    $this->Auth->allow('login', 'logout');
}

Salut, j'ai le même problème que toi, j'ai un site fonctionnel avec gestion des ACLs, et tous... Je décide de suivre le tuto vidéo pour faire un site multilingue, cela marche, sauf que je n'ai plus aucun accès au panel d'administration, aucun moyen de me connecter. Si quelqu'un aurait une solution s'il vous plaît.

Freega
Auteur

J'ai résolu mon problème avec ce code:

function beforeFilter(){
        //Configue i18nComponent
        if(!isset($this->params'prefix'])) {
            if(!$this->Session->read('User.language')){
                $this->Session->write('User.language',Configure::read('Config.language'));

            }
            if(isset($this->params'language'])){
                if(in_array($this->params'language'],Configure::read('Config.languages'))){
                    $this->Session->write('User.language',$this->params'language']);
                }
            }   
            Configure::write('Config.language',$this->Session->read('User.language'));
            $this->params'language'] = $this->Session->read('User.language');
        }

        if(isset($this->params'prefix']) && $this->params'prefix'] == 'admin' && $this->action != 'admin_login' && $this->action != 'admin_logout') {
            //Configure AuthComponent
            $this->Auth->authorize = 'actions';
            $this->Auth->loginAction = array('controller' => 'users', 'action' => 'login');
            $this->Auth->logoutRedirect = array('controller' => 'Dashboard', 'action' => 'admin_index');
            $this->Auth->loginRedirect = array('controller' => 'Dashboard', 'action' => 'admin_index');
        } else {
            $this->Auth->allow();

        }

    }

En espérant que ça pourra d'aider sinon n'hésite pas.

Salut, je viens de tester ta solution, je n'ai toujours pas accès au panel, je me loggue sur localhost:8888/users/login, celle-ci me redirige toujours vers la même page, celle de login.

Freega
Auteur

Et si tu supprime la gestion i18n du appcontroller, tu y as accès?

En supprimant la fonction "if" pour la gestion du i18n, tous remarche comme avant, accès à tous les fonctionnalités du panel admin avec les utilisateurs, si je remet le i18n, plus rien.

Freega
Auteur

Et si à la place de :

if(!isset($this->params'prefix'])) {

tu mets :

if(isset($this->layout'nom de layout du front office'])) {

Ça fait pareil?

Toujours pas.
Dis moi à quoi te sers cette ligne?

if(isset($this->params'prefix']) && $this->params'prefix'] == 'admin' && $this->action != 'admin_login' && $this->action != 'admin_logout')
Freega
Auteur

Cette ligne me sert à configurer le comp Auth lorsqu'il y a un prefixe ,quand le prefixe est admin, quand l'action n'est pas la vue admin_login et admin_logout.
Comme ça la configuration ne se fait que lorsque j'en ai besoin.

Okay, sinon mon problème persiste toujours:

  • i18n présent : connexion impossible
  • i18 supprimé : connexion possible

Je ne vois pas le problème, vraiment pas.

Edit 1:
Ce qui est bizarre, c'est que j'accède au panel par:
localhost:8888/users/login
et qu'il me redigire vers
localhost:8888/fre/users/login

De plus, je viens de tester en remplaçant

if (!isset ($this->params'prefix']))

par

if (!isset ($this->params'language']))

Cela ne fonctionne toujours pas.