IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Zend Framework PHP Discussion :

Routage personnalisé langue


Sujet :

Zend Framework PHP

  1. #1
    Invité
    Invité(e)
    Par défaut Routage personnalisé langue
    bonjour, je débute dans l'univers extraordinaire de ZEND facon MVC.
    Je suis en train de refaire un vieux site PHP bordélique en Zend afin de me familiariser avec les diverses fonctions.
    J'ai des fichiers de traduction et pour faire un peu "pro" j'aimerai que la navigation se fasse de cette facon : http://monsite.com/lang/controller/action

    ou lang serait un code langue (fr, en,...). mais je ne comprend pas comment fonctionne le routage personnalisé.
    J'oriente mes recherche du côté de Zend_Controller_Router_Route et addRoute
    mais je suis vraiment pas sur de bien partir.
    Lorsque je fais un addRoute sur un objet router est-ce que ca rajoute mon objet Zend_Controller_Router_Route à la fin de la liste de paramètre ?
    Pour faire simple il faudrait que je puisse ajouter un paramètre avant le controller/action/id.

  2. #2
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 506
    Par défaut
    Pour un site multilingue le ZF à fais une classe pour ça ici, je pense que cela sera plus simple.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Effectivement, c'est ce que j'ai à l'heure actuelle, avec mes fichier tmx et ca marche nickel.
    Maintenant mon but c'est de dynamiser ca. J'ai ma classe indexController qui possède une fonction langAction() qui permet de changer de lang.

    avec http://monsite.com/index/lang/en ca marche. Mais j'aimerais que la navigation se fasse de cette facon http://monsite.com/en/controllers/action.

    J'y voit une bonne facon d'utiliser Zend_Router, le but étant pour moi d'apprendre à manipuler Zend plus que de sortir le site dans un délai.
    Mais c'est pas évident de comprendre la logique Zend lorsque l'on à sortie que du code sauce bazar jusqu'à présent ;-)

  4. #4
    Membre éprouvé Avatar de lalouve
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2004
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2004
    Messages : 128
    Par défaut
    Salut,

    Ce problème de routage m'intéresse aussi.

    Quelles routes faut-il créer pour avoir des url du type
    /:langue/:module/:controller/:action/* ?

    Avec, et c'est là mon soucis, langue et module optionnels... c'est à dire pour que tous les paramètres soient correctement initialisés pour les url suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    - site.fr
    - site.fr/module
    - site.fr/module/controller
    - site.fr/module/controller/action
    - site.fr/controller/
    - site.fr/controller/action
    - site.fr/langue
    - site.fr/langue/module
    - site.fr/langue/module/controller
    - site.fr/langue/module/controller/action
    - site.fr/langue/controller
    - site.fr/langue/controller/action
    J'ai beau me battre avec les regexp, il y a toujours un cas ou cela foire...
    Si quelqu'un a déjà travaillé sur un site multilingue avec le paramètre de la langue en 1er dans l'url, pourrait-il m'indiquer sa solution/ses routes ?

    Merci pour vos avis éclairés.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Pour info, j'ai laissé tomber ça me saoule, je reviendrais dessus quand j'aurais terminé le reste. Je sais c'est pas ce qu'il y as de plus pratique, mais j'ai vraiment envie de comprendre comment fonctionne ce "chenapan" de routage Zend .

  6. #6
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 277
    Par défaut
    J'ai eu cette réflexion il y a quelques temps.
    Voici comment j'ai fait (.ini):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    routes.compat.route = ":language/:controller/:action/*"
    Cela engendre cependant d'autres problèmes par la suite.
    Vous pouvez avoir une partie plus complète de mon fichier de config et le problème que je rencontre sur le topic suivant :
    [ZF1.5][Route] Besoin d'aide pour la configuration des mes routes => url propre
    Je trouves que la doc du manuel sur le router n'est vraiment pas clair.
    Si vous trouvez un tuto, un livre ou autre source d'infos là dessus, je suis prenneur!!!

  7. #7
    Invité
    Invité(e)
    Par défaut
    Merci pour ta réponse.
    Moi je trouve que la doc officielle est limite sur à peu près tout. C'est difficile de rentrer dans le détail. Faut ouvrir les classes de la bibliothèque Zend pour avoir les méthodes, c'est la meilleur façon que j'ai trouvée :-D.
    J'avance pas vite, mais chaque pas est un pas de géant.

  8. #8
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 277
    Par défaut
    Oui, je suis d'accord.
    Le manuel porte bien son nom. Cela ressemble au manuel de php et je ne connais personne qui a commencé à lire le manuel pour apprendre le php.
    C'est un support pour avoir des détails sur les fonctions et même pour ce coté là, le manuel zf n'apporte pas toutes les infos.
    Heureusement qu'il existe cette communauté assez active. Personnellement, je l'en remercie.
    enfin bref. Le sujet n'est pas là.

    N'hésite pas à nous informer de ton avancement. Je pense que les "pas de géant" de chacun peut largement aider les autres.

  9. #9
    Invité
    Invité(e)
    Par défaut
    Bon pour revenir sur le sujet, j'ai réussis à obtenir le résultat escompté (routage /:langue/:controller/:action) en faisant ceci :

    dans mon index.php :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    $router = new Zend_Controller_Router_Rewrite();//on récupère le front controller
    //ensuite on change le routage par défaut en indiquant des valeurs par défaut
    //qui seront utilisée pour le dispatch du front controller
    $router->addRoute( 
        "default",
        new Zend_Controller_Router_Route(
            "/:language/:controller/:action/*",
            array(
                "language"      =>  "fr",
                "controller"    =>  "index",
                "action"        =>  "index"
            )
        )
    );
    $frontController->setRouter($router);
    maintenant il me reste plus qu'à tout me changer mon systéme de localisation ;-). Je tiens au courant niveau pérénité du bousin bien entendu !

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 98
    Par défaut
    Bonjour tout le monde.

    Pour la route '/:language/:controller/:action/*'.
    N'oubliez pas que vous pouvez définir des requirements.
    Genre :

    routes.default.route = "/:language/:controller/:action/*"
    routes.default.defaults.language = fr
    routes.default.defaults.controller = index
    routes.default.defaults.action = index
    routes.default.defaults.year = 2000
    routes.default.reqs.language = "[a-z]{2}"

    ou encore

    routes.default.reqs.language = "(fr)|(en)" pour limiter vos langues au français et à l'anglais...

    Cela vous permettera, de définir d'autre routes unilingue qui ne matcherons pas le pattern de celle-ci

    Voilà, c'était ma petite pierre apportée à l'édifice

  11. #11
    Invité
    Invité(e)
    Par défaut
    Merci pour la précision Olivier !

    Bon, j'ai une autre petite question directement liée a ce type de routage: comment utiliser tout çà ? J'avais pour idée de récupérer le language dans mon index.php et faire un setLocate().
    Mais comment récupérer le paramètre 'language' avec le frontcontroller ?

    j'ai essayé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $frontcontroller->getRequest->getParam('language');
    $frontcontroller->getRequest()->getParam('language');
    $frontcontroller->_getRequest->getParam('language');
    $frontcontroller->getParam('language');
    Mais rien à faire dans le meilleur des cas çà me remonte NULL

    mon fichier index.php :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    <?PHP
    define('ZEND_PATH','***');
    define('APP_PATH','***');
     
    set_include_path('.' . PATH_SEPARATOR . ZEND_PATH
      . PATH_SEPARATOR . APP_PATH . '/models/classes/'
      . PATH_SEPARATOR . APP_PATH . '/models/forms/'
      . PATH_SEPARATOR . get_include_path());
     
    require "Zend/Loader.php";
    Zend_Loader::registerAutoload();
     
    $registry = Zend_Registry::getInstance();
     
    $frontController = Zend_Controller_Front::getInstance();
    $frontController->setControllerDirectory(APP_PATH . '/controllers');
    $router = new Zend_Controller_Router_Rewrite();
    $router->addRoute(
        "default",
        new Zend_Controller_Router_Route(
            "/:language/:controller/:action/*",
            array(
                "language"      =>  "fr",
                "controller"    =>  "index",
                "action"        =>  "index"
            )
        )
    );
    $frontController->setRouter($router);
     
    Zend_Layout::startMvc(array('layoutPath'=>APP_PATH . '/views/layouts'));
     
    $db = Zend_Db::factory($config->BDD->db);
    Zend_Db_Table::setDefaultAdapter($db);
     
    $frontController->dispatch();
    ?>

  12. #12
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 277
    Par défaut
    Peux tu essayer ce code ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->_request->getParam('language')

  13. #13
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 98
    Par défaut
    Salut infameus,

    Bon je vais essayer de t'expliquer avec ce que j'ai réussi à comprendre au travers de mon expérience naissante de ZF.

    En gros, ton paramètre 'language' se ne trouve pas dans le Zend_Controller_Front quand tu es dans ton bootstrap. Il va se retrouver dans l'objet Zend_Controller_Request une fois qu'il sera initialisé, à la fin du routage. C'est le Zend_Controller_Router qui se charge de remplir l'objet requête de ses paramètres pendant le dispatch.

    Donc tu pourras récupérer les paramètres de ta requête dans ton controller d'action (Zend_Controller_Action, forcément) en faisant quelque chose du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ...
    public function monAction {
      $request = $this->getRequest();
     
      $language = $request->getParam('language');
      ...
    }
    Dans ce cas tu devras traiter ton paramètre dans chaque action... Ce qui ne parraît pas la meilleure solution sinon peut-être pour un tout petit site d'une page.


    La deuxième solution est d'avoir un traîtement au niveau du controller et plus de l'action. Dans cas tu peux faire ceci, par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class monController extend Zend_Controller_Action {
    protected $_language;
     
    public function init() {
      $request = $this->getRequest();
     
      $this->_language = $request->getParam('language');
      ...
    }
    Dans ce cas tu auras ta langue disponible par toutes les actions de ton controller avec $this->_language. Ce qui est déjà plus intéressant mais il te faudra refaire le même travail pour chacun de tes controllers.


    Ce qui nous amène à la troisième solution. Le front controller peut enrgistrer des plugins (Zend_Controller_Plugin). Ceux-ci peuvent intervenir à différents moment du cycle MVC, ce qui est intéressant puisque le traitement de la langue devrait se faire avant que la requête ne soit transmise à un controller d'action. Ce qui peut être fait comme suis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class My_Plugin_Language extends Zend_Controller_Plugin_Abstract {
      public function routeShutdown(Zend_Controller_Request_Abstract $request) {
        $language = $request->getParam('language');
        ...
        // Vérification et traitement de la langue
        ...
        $translateAdapter = new Zend_Translate('gettext', 'monchemin/languages', null, array('scan' => Zend_Translate::LOCALE_DIRECTORY));
       $translateAdapter->setLocale($language);
       // En enregistrant l'adpter de traduction sous le nom 'Zend_Translate', cela vous permet d'utiliser l'aide de vue translate() directement dans vos views ...
       Zend_Registry::set('Zend_Translate', $translateAdapter);
       Zend_Registry::set('language', $language);
      }
    }
    N'oublie pas dans le bootstrap.php :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ...
    $front = Zend_Controller_Front::getInstance();
    $front->registerPlugin(new My_Plugin_Language());
    ...
    Tu pourras maintenant disposer de ta langue partout dans ton application via la registry (Zend_Registry::get('language')).

    Je te laisse voir la doc sur les plugins et pour mieux comprendre : http://framework.zend.com/manual/en/...s.introduction.

    Voilà, j'espère que ça t'aide un peu. Bonne continuation.

    PS: Si tu veux voir comment j'ai stocker mes plugin, fait un tour sur la discussion suivante : http://www.developpez.net/forums/d64...oload-require/

  14. #14
    Invité
    Invité(e)
    Par défaut
    Encore merci, j'ai retenu la deuxième solution pour le moment, je jetterai un œil sur Zend_Controller_Plugins un peu plus tard.

    Ca fais quand même pas mal de chose à voir au final ;-).
    Bientôt Zend_Auth et Zend_Acl les incontournable, j'en frémis d'avance !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Strategie]gestions de differentes langues
    Par merlin_le_chanteur dans le forum Struts 1
    Réponses: 15
    Dernier message: 09/04/2004, 15h45
  2. Réponses: 9
    Dernier message: 14/10/2003, 15h35
  3. fonction MessageDlg Delphi :changer la langue
    Par julie20 dans le forum Composants VCL
    Réponses: 3
    Dernier message: 06/06/2003, 17h44
  4. [POSTGRESQL et JDBC] la langue de moliere
    Par jah dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 15/05/2003, 11h21
  5. Changement de langue dynamique (D6 et outils de traduction)
    Par agon dans le forum Composants VCL
    Réponses: 4
    Dernier message: 17/09/2002, 16h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo