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

Symfony PHP Discussion :

Structure pour gestion des langues [Débutant(e)] [2.x]


Sujet :

Symfony PHP

  1. #1
    Membre à l'essai
    Inscrit en
    Novembre 2008
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 21
    Points : 18
    Points
    18
    Par défaut Structure pour gestion des langues
    Bonsoir,

    Je suis un grand débutant sous symfony2, je m'y suis mis hier et je suis avide de connaissances !

    Je suis en train de faire un site multilangue en même temps que je découvre ce fabuleux framework

    Cependant je bloque sur une question de "logique" pour la gestion de plusieurs langue

    Actuellement j'ai deux bundles, un menu, un homepage, pas très compliqué, mon template de base inclus :
    - le menu et la page demandée (pour le moment uniquement homepage.)

    J'ai deux questions.

    Je comptais faire un bundles par page (6 au total) mais je me demande si il ne vaudrait mieux pas faire un bundle page, et afficher la bonne page en fonction de l'uri

    Que me conseilllez vous ? Pourquoi ?

    Deuxieme question. Quand je met la langue EN (par défaut FR) j'envoi en $_GET un param ?lang=en ou fr et je vais chercher les correspondances dans un fichier xml en fonction de la valeur de $_GET['lang'] (YAML semble pas trop être supporté par php, je me trompe ?) hors ce $_GET peut ne pas exister (donc défaut FR)

    actuellement j'ai ca

    home_homepage:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        pattern:  /{lang}
        defaults: { _controller: HomeBundle:Home:index,lang:fr }
    Mais si je met comme URL monsite/app_dev.php/En <==== ca marche


    monsite/app_dev.php/En/ déclenche No route found for "GET /en/

    Comment autoriser /en /en/ et /

  2. #2
    Membre éclairé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2011
    Messages
    477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Août 2011
    Messages : 477
    Points : 677
    Points
    677
    Par défaut
    Bonjour,

    Je t'invites avant d'aller plus loin de suivre les tutoriel symphony, et la documentation trés fournis sur le Symfony car dans ta question, il y a le concept de MVC qui ne semble pas compris.

  3. #3
    Membre à l'essai
    Inscrit en
    Novembre 2008
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 21
    Points : 18
    Points
    18
    Par défaut
    J'ai fait tout un site e-commerce sous prestashop je connais le MVC mais l'approche de symfony est différente et me trouble pour le moment.

    C'est le système de routing et d'appel de template qui me pose problème.

    Imaginons que la racine de mon site soit : xxxxxxxx/public/

    Dans mon base.html.twig je pose la structure du site, à savoir le menu son fichier css, et la disposition globale du site.

    comme ceci grossierement

    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
    <!DOCTYPE html>
    <html>
    	<head>
    		<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    		<title>{% block title %}Welcome ! {% endblock %}</title>
    		{% block stylesheets %}
    			<link href="{{ asset('css/main.css') }}" type="text/css" rel="stylesheet" />
    			<link rel="stylesheet" href="{{ asset('bundles/menu/css/MenuTop.css') }}" type="text/css" media="all" />
    			<link rel="stylesheet" href="{{ asset('bundles/home/css/Home.css') }}" type="text/css" media="all" />
    		{% endblock %}
    		<link rel="shortcut icon" href="{{ asset('favicon.ico') }}" />
    	</head>
    	<body>
    		<div class="navigation">
    			{% include 'MenuBundle:Menu:index.html.twig' %}
    		</div>
    		{% block corps %}{% endblock %}
    		{% block javascripts %}{% endblock %}
    	</body>
    </html>
    Puis en fonction de la page, imaginons que l'utilisateur clique sur le menu Education :

    xxxxxxx/public/en/education

    donc j'ai dans le routing du bundle Education ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    page_Education:
        pattern:  /public/{_locale}/Education
        defaults: { _controller: EducationBundle:Education:index,_locale: en}
        requirements:
            _locale: en|fr
    mon controlleur ne fait rien a part rendre le template
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    return $this->render('EducationBundle:Education:index.html.twig');
    qui contient bêtement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    {% extends '::base.html.twig' %}
     
    {% block title %}
    	Education
    {% endblock %}
    {% block corps %}
    	Contenu de la page Education
    {% endblock %}
    Est-ce que jusqu'ici j'ai bon ? La structure est-elle correct ?

    Ensuite dans le book Symfony il est dit qu'en spécifiant le paramètre spécial _locale dans une route, la locale correspondante sera automatiquement définie dans la session de l'utilisateur

    Dans mon contrôlleur j'arrive bien a récuperer la valeur via :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $Request = $this->getRequest();
    $lang = $r->getLocale();
    Cependant, c'est mon menu qui me pose problème

    J'ai installé le bundle knp_menu

    et il marche mais je n'arrive pas a gérer la langue

    MenuBundle:Menu:index.html.twig

    contient

    <div class="conteneur_menu">
    {% block menu %}
    {{ knp_menu_render('MenuBundle:MenuBuilder:mainMenu') }}
    {{ knp_menu_render('MenuBundle:MenuBuilder:regLanguageMenu') }}
    {% endblock %}
    </div>

    J'appel la classe MenuBuilder mais je ne sais pas comment reconnaitre la langue définit par l'URL, c'est la que je suis perdu

    Ma première question :

    1- Suis je obligé de définir un routing pour mon menu, sachant que c'est dans la classe même que je vais bidouiller la langue car la j'ai mis le code ci-dessous mais quoi que je met je n'ai aucune erreur même sous app_dev.php

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    menu:
        pattern:  /
        defaults: { _controller: MenuBundle:Menu:index,_locale: en}
        requirements:
            _locale: en|fr
    Ce qui est spéciale ici c'est que mon controlleur affiche mon template qui lui même rappelle la classe qui va génerer le code html du menu, comme ceci :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <div class="conteneur_menu">
    	{% block menu %}
    		{{ knp_menu_render('MenuBundle:MenuBuilder:regLanguageMenu') }}
    	{% endblock %}
    </div>
    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
     
     
    <?php
    namespace xxxxx\Bundle\MenuBundle\Menu;
     
    use Knp\Menu\Matcher\Matcher;
    use Knp\Menu\MenuFactory;
    use Knp\Menu\Renderer\ListRenderer;
    use Symfony\Component\DependencyInjection\ContainerAware;
     
    class MenuBuilder extends ContainerAware
    {
     
    	public function regLanguageMenu()
        {
     
    		$factory = new MenuFactory();
            $menu = $factory->createItem('root');
     
            $menu->addChild('English', array('uri' => 'javascript:showLanguageAvailable()'));
    		$menu->setChildrenAttribute('class', 'menu_top_right_gen');
            return $menu;
        }
    }
    Comment puis je récuperer cette fichue variable session de langue censé être enregistré avec _locale

    Comment puis-je modifier cette même valeur ?

    Merci

  4. #4
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    725
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 725
    Points : 1 050
    Points
    1 050
    Par défaut
    Bonjour,
    Ton menu héritant de ContainerAware, tu as accés au container et par ce biais tu as également accés à la requete http en cours.

    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
     
    <?php
    namespace xxxxx\Bundle\MenuBundle\Menu;
     
    use Knp\Menu\Matcher\Matcher;
    use Knp\Menu\MenuFactory;
    use Knp\Menu\Renderer\ListRenderer;
    use Symfony\Component\DependencyInjection\ContainerAware;
     
    class MenuBuilder extends ContainerAware
    {
     
    	public function regLanguageMenu()
        {
     
    		$factory = new MenuFactory();
                    $menu = $factory->createItem('root');
     
                    $locale=$this->container->get('request')->getLocale();
                    if($locale=='fr'){
                        $menu->addChild('English',array('route'=>'homepage','route_parameters'=>'en'));
                    }
                    elseif($locale="en"){
                       $menu->addChild('English',array('route'=>'homepage','route_parameters'=>'en'));
                    }
                    //......
                    return $menu;
        }
    }
    en déclarant ton menu en tant que service tu aurais accés à cette requete directement en tant qu'argument de la méthode:
    https://github.com/KnpLabs/KnpMenuBu...enu_service.md

  5. #5
    Membre à l'essai
    Inscrit en
    Novembre 2008
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 21
    Points : 18
    Points
    18
    Par défaut
    Ok merci je vais tester cela

  6. #6
    Membre à l'essai
    Inscrit en
    Novembre 2008
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 21
    Points : 18
    Points
    18
    Par défaut
    Tout fonctionne Merci !

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

Discussions similaires

  1. [Windows Phone 8] [TUTO] Trucs et astuces pour la gestion des langues pour Universal Apps (Windows Phone 8.1)
    Par ChickenJim dans le forum Windows Phone
    Réponses: 3
    Dernier message: 15/02/2015, 15h41
  2. [C#] Gestion des langues d'une application
    Par therock dans le forum Windows Forms
    Réponses: 4
    Dernier message: 15/05/2006, 08h47
  3. [Frameworks] pour Gestion des utilisateurs...
    Par blackhorus dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 04/04/2006, 05h25
  4. [Plugin]Eclipse et la gestion des langues
    Par Gougou dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 26/07/2005, 12h51
  5. [XSLT] Comment procéder pour gérer des langues ?
    Par virgul dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 31/03/2005, 11h01

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