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

MVC PHP Discussion :

Routage et internationalisation [ZF 1.7]


Sujet :

MVC PHP

  1. #1
    Membre du Club
    Inscrit en
    Décembre 2008
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 57
    Points : 42
    Points
    42
    Par défaut Routage et internationalisation
    Salut à tous,
    J'aimerai pouvoir autoriser 3 langues pour mon site du genre:

    \\monsite/fr/actions //pour le français
    \\monsite/en/actions //pour la partie anglaise.
    \\monsite/ar/actions //pour l'Arabe

    NB : j'utilise pour la traduction le fichier TMX qui contient les 3langues
    Le problème est que je ne sais pas comment faire le routage.

    Ou devrais je mettre les langues comme paramètres comme ceci:


    Merci de bien vouloir me donner un coup de main.

  2. #2
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    Bonjour,

    Pour être traité dans tes contrôleurs, il faut que la langue soit passée en paramètre. Pour cela, par défaut, il suffit d'avoir des adresses sous la forme :
    http://monsite/controleur/action/langue/[fr|en|ar]

    Dans ce cas, la langue peut être récupérée dans le paramètre 'langue'. Si tu veux améliorer la présentation de ces adresses, en proposant à la place http://monsite/[fr|en|ar]/controleur/action, il faut que tu définisse une route personnalisée au niveau de ton bootstrap, quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $route = new Zend_Controller_Router_Route(':langue/:controller/:action/*',
        array('controller' => 'index',
              'action' => 'index',
              'module' => 'default',
              'langue' => 'fr'));
    $router = $frontController->getRouter();
    $router->addRoute('default', $route);
    $frontController->setRouter($router);
    De la même façon, la langue se retrouvera dans le paramètre 'langue' (avec par défaut 'fr').

  3. #3
    Membre du Club
    Inscrit en
    Décembre 2008
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 57
    Points : 42
    Points
    42
    Par défaut
    voici le cde que j'ai ajouter à mon bootstrap pour réaliser le routage des langues:

    code bootstrap :
    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
     
    //Définition de la langue à afficher
    $locale=new Zend_Locale(Zend_Locale::BROWSER);
    //charegement du fichier de traduction
    $translator=new Zend_Translate('tmx',"./application/languages/languages.tmx",$locale);
    Zend_Registry::set('translator',$translator);
    //Ajouter la nouvelle route
    $router=new Zend_Controller_Router_Rewrite();
    $router->addRoute(
       new Zend_Controller_Router_Route("/:language/:controller/:action/*",
       array(
         "language" => "fr",
         "controller" => "index",
         "action" => "index",
         )  ));
    //attribution de la route au front controller
    $frontController->setRouter($router);
    //définition des langues
    $language=$frontController->getRequest()->getParam("langauge", "fr");
    switch($language)
    {
    	case "en":
    		$locale=new Zend_Locale("en");
    		break;
    	case "ar":
    		$locale=new Zend_Locale("ar");
    		break;
    	default:
    		$locale=new Zend_Locale("fr");
    		break;	
    }
    $frontController->dispatch();
    mais j'ai l'erreur suivant suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Fatal error: Call to a member function getParam() on a non-object in /var/www/Morogoo/index.php on line 44
    est la ligne 44 c'est : $language=$frontController->getRequest()->getParam("langauge", "fr");

    si qlq à une idée sur cette erreur

  4. #4
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    C'est qu'à ce moment là le contrôleur frontal n'a pas encore initialisé son objet requête. En fait, il le fait après appel à dispatch()...

    Je pense qu'il faudrait plutôt que tu initialises ta variable $locale dans un plugin, par exemple dans la fonction dispatchLoopStartup, qui est appelée avant que le contrôleur frontal ne commence le dispatching.

  5. #5
    Membre du Club
    Inscrit en
    Décembre 2008
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 57
    Points : 42
    Points
    42
    Par défaut
    SVP Eusebe je suis un débutant dans ZF est ce que tu peut me dire comment initialises la variable $local dans un "plugin"

    et merci d'avance

  6. #6
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    Un plugin de contrôleur permet d'exécuter du code à différents instants du processus de dispatching : http://framework.zend.com/manual/fr/...r.plugins.html

    Dans ton cas, puisque je suppose que tu veux que la langue choisie soit valable quelle que soit l'action appelée, l'idéal est de récupérercette information le plus tôt possible, après que la requête soit définie. Je t'ai proposé la méthode dispatchLoopStartup(), mais on pourrait aussi le faire sur routeShutdown().

    Voici un exemple de plugin (à tester et améliorer...) :
    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
    class MyApp_Controller_Plugin_Language extends Zend_Controller_Plugin_Abstract
    {
        public function dispatchLoopStartup(Zend_Controller_Request_Abstract $request)
        {
            $language = $request->getParam('language');
            switch($language)
            {
                case 'en':
                case 'ar':
                    $locale=new Zend_Locale($language);
                    break;
                default:
                    $locale=new Zend_Locale('fr');
            }
            $adapter = new Zend_Translate('tmx',
                                    'chemin/vers/mytranslation.tmx',
                                    $locale);
            Zend_Registry::set('Zend_Translate', $adapter);
        }
    }
    Dans ce plugin, je récupère la langue choisie (comme tu l'avais fait), puis je l'utilise pour initialiser un objet Zend_Translate que j'enregistre dans le registre sous la clé 'Zend_Translate'. Si je te propose ça, c'est simplement pour pouvoir utiliser ensuite l'aide vue 'Translate'.

    Ce plugin doit être dans un fichier 'Language.php' situé dans /library/MyApp/Controller/Plugin/ suivant le nom de la classe (en supposant que le dossier library existe chez toi et soit dans l'include_path de PHP).

    Enfin, pour activer ce plugin, il faut le déclarer dans le bootstrap :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $frontController->registerPlugin(new MyApp_Controller_Plugin_Language());
    Si tu as des questions, n'hésites pas !
    Bon courage !

  7. #7
    Membre du Club
    Inscrit en
    Décembre 2008
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 57
    Points : 42
    Points
    42
    Par défaut
    Merci beaucoup Eusebe pour tes propositions et tes efforts.
    mais veuillez à m'excuse j'ai encore d'autre question :

    j'ai sais pas encore ou je vais ajouter ce plugin (ou je vais trouve le dossier library) et comment (est ce que je vais l'ajouter au fichier Language.php)
    NB : j'utilise wamp

    Cordialement

  8. #8
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    Comment est structuré ton site sous Zend ?

    Si tu utilises le MVC, tu dois avoir une structure similaire à celle du tutoriel MVC : http://g-rossolini.developpez.com/tu...ganisation#LII

    Le dossier 'library' est celui qui contient déjà la bibliothèque du framework Zend.
    Ce dossier doit être compris dans l'include_path de PHP.

    Je ne comprend pas ta question sur comment ajouter ce plugin... En fait c'est simplement une classe php... Donc il peut être créé comme tous les fichiers php que tu génères. Pour que le framework retrouve ses petits, il faut 'simplement' respecter ses conventions de nommage : http://framework.zend.com/manual/fr/...nventions.html

    Donc pour une classe 'MyApp_Controller_Plugin_Language', il faut que ce soit dans un fichier MyApp/Controller/Plugin/Language.php (mais tu peux le nommer autrement, à partir du moment où la convention est respectée)

    Pour une découverte des plugins, n'hésites pas à consulter le tutoriel de Julien Pauli :
    http://julien-pauli.developpez.com/t...?page=sommaire

  9. #9
    Membre du Club
    Inscrit en
    Décembre 2008
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 57
    Points : 42
    Points
    42
    Par défaut
    j'ai suivi tes instructions et voici l'erreur qui me donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Fatal error: Class 'MyApp_Controller_Plugin_Language' not found in C:\wamp\www\language\index.php on line 25
    j'ai met mon plugin dans ce chemin :
    C:\wamp\www\Test\library\MyApp\Controller\Plugin
    et voici mon bootstrap
    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
     
    <?php
    error_reporting(E_ALL|E_STRICT);
    date_default_timezone_set('Europe/Paris');
    set_include_path('.'
        . PATH_SEPARATOR . './library'
        . PATH_SEPARATOR . get_include_path());
    include "Zend/Loader.php";
    // Chargement des classes
    Zend_Loader::loadClass("Zend_Locale");
    Zend_Loader::loadClass("Zend_Translate");
    Zend_Loader::loadClass('Zend_Controller_Front');
    Zend_Loader::loadClass('Zend_Controller_Action');
    Zend_Loader::loadClass('Zend_Registry');
     
    $frontController = Zend_Controller_Front::getInstance();
    $frontController->throwExceptions(true) // for dev, put it to TRUE
                    ->addModuleDirectory("./application")
                    ->setControllerDirectory('./application/controllers');
     
    $frontController->registerPlugin(new MyApp_Controller_Plugin_Language());
     
    // Chargement du rewriter
    Zend_Loader::loadClass('Zend_Controller_Router_Rewrite');
    // Ajout de la nouvelle route
    $router = new Zend_Controller_Router_Rewrite();
    $router->addRoute("",
        new Zend_Controller_Router_Route(
            "/:language/:controller/:action/",
            array(   "language"      =>  "fr",   "controller"    =>  "index",   "action"        =>  "index"
            )));
    // Attribution de la route au front controller
    $frontController->setRouter($router);
    // run!
    $frontController->dispatch();
    cordialement

  10. #10
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    Pour le chargement des classes avec le Zend Framework, tu as deux options :
    - utiliser Zend_Loader::loadClass (comme tu le fais) pour chaque élément utilisé ;
    - utiliser l'autoload de Zend : http://framework.zend.com/manual/fr/....load.autoload

    Dans ce dernier cas, tu n'as plus besoin d'utiliser Zend_Loader::loadClass, le framework se charge tout seul d'inclure les fichiers correspondant aux classes utilisées.

    En pratique, ces deux solutions donnent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    include "Zend/Loader.php";
    // Chargement des classes
    Zend_Loader::loadClass("Zend_Locale");
    Zend_Loader::loadClass("Zend_Translate");
    Zend_Loader::loadClass('Zend_Controller_Front');
    Zend_Loader::loadClass('Zend_Controller_Action');
    Zend_Loader::loadClass('Zend_Registry');
    Zend_Loader::loadClass('MyApp_Controller_Plugin_Language');
    ou :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    include "Zend/Loader.php";
    Zend_Loader::registerAutoload();
    A toi de voir la méthode que tu préfères

  11. #11
    Membre du Club
    Inscrit en
    Décembre 2008
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 57
    Points : 42
    Points
    42
    Par défaut
    veuillez à m'excuse une autre fois Eusebe
    c'est ma 1ére confrontation avec zend_translate, j'ai encore un autre pb:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    <br />
    <b>Fatal error</b>:  Uncaught exception 'Zend_Exception' with message 'No entry is registered for key 'translator'' in C:\wamp\www\language\library\Zend\Registry.php:145
    Stack trace:
    #0 C:\wamp\www\language\application\controllers\IndexController.php(7): Zend_Registry::get('translator')
    #1 C:\wamp\www\language\library\Zend\Controller\Action.php(118): IndexController-&gt;init()
    #2 C:\wamp\www\language\library\Zend\Controller\Dispatcher\Standard.php(261): Zend_Controller_Action-&gt;__construct(Object(Zend_Controller_Request_Http), Object(Zend_Controller_Response_Http), Array)
    #3 C:\wamp\www\language\library\Zend\Controller\Front.php(934): Zend_Controller_Dispatcher_Standard-&gt;dispatch(Object(Zend_Controller_Request_Http), Object(Zend_Controller_Response_Http))
    #4 C:\wamp\www\language\index.php(53): Zend_Controller_Front-&gt;dispatch()
    #5 {main}
      thrown in <b>C:\wamp\www\language\library\Zend\Registry.php</b> on line <b>145</b><br />
    et voici mon indexcontroller.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
     
    <?php
    class IndexController extends Zend_Controller_Action 
    {
     
        function init()
        {
              $this->view->translator = Zend_Registry::get('translator');
        }
        function indexAction()
        {
     
        }
    }
    NB : et ce translator c'est celui indique dans le plugin
    $translator = new Zend_Translate('tmx','C:\wamp\www\language\languages\languages.tmx',$locale);

    et si vous avez une idée sur ce pb!!!!!!!
    et merci d'avance

  12. #12
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    Quel est le code du plugin ?

    Y a-t-il une ligne enregistrant le 'translator' dans le registre ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Zend_Registry::set('translator', $translator);

  13. #13
    Membre du Club
    Inscrit en
    Décembre 2008
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 57
    Points : 42
    Points
    42
    Par défaut
    Merci beaucoup Eusebe pour tes conseils, tes suggestion et tes solutions qui mon idée à resoudre ce probléme et comprendre mieux plusieurs nouveaux notion sur zend_translate et l'utilité des plugins ...
    Merci beaucoup
    you are

  14. #14
    Membre du Club
    Inscrit en
    Décembre 2008
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 57
    Points : 42
    Points
    42
    Par défaut
    Salut,

    SVP si qlq à déjà teste le routage de Zend_Controller_Router_Rewrite() sur une application exécuter sous linux (ubuntu).
    ------
    Exp :
    http://localhost/Test/en
    sur windows ça marche trés bien.
    sur linux (ubuntu) => The requested URL /Test/en was nto found on this server.
    ------
    NB: le plugin il est détecter car lorsque je change :la 3éme paramétré du Zend_Translate il le prend on considération
    $translator = new Zend_Translate('tmx','./languages/languages.tmx',$locale);

    et Merci d'avance.

  15. #15
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    Bonjour,

    Ca ne ressemble pas à un problème de Zend_Controller_Router_Rewrite, mais plutôt de réécriture d'urlpar apache.

    Tu utilises un fichier .htaccess ? Si oui que contient-il ?
    Est-ce que le module rewrite_module d'apache est bien activé ?

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

Discussions similaires

  1. [Struts] Internationalisation
    Par kayoups dans le forum Struts 1
    Réponses: 2
    Dernier message: 01/09/2004, 16h19
  2. [Kylix] internationalisation
    Par bohort dans le forum EDI
    Réponses: 1
    Dernier message: 26/07/2004, 18h26
  3. [STRUTS] INTERNATIONALISATION ==>> EXEMPLE
    Par zarbydigital dans le forum Struts 1
    Réponses: 10
    Dernier message: 23/03/2004, 14h55
  4. [Unicode] Internationalisation d'une application
    Par Thierry Laborde dans le forum Langage
    Réponses: 4
    Dernier message: 21/10/2003, 20h15
  5. [CR] internationalisation d'un report
    Par osoudee dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 24/06/2002, 16h54

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