Rechercher dans ce blog

Chargement...

mercredi 18 novembre 2009

Symfony : changer de langue manuellement avec des drapeaux

Ce Post fait suite à "changer de langue manuellement avec un menu déroulant" :
- Le plugin sfFormExtraPlugin est installé
- Le module "language" a été généré
- Les langues disponibles sont créées dans app.yml

Modifier la Classe de Composants
 "components.class.php" a été créée. Elle est modifié ainsi :

    public function executeDrapeaux(sfWebRequest $request)
    {
        # les drapeaux
//        $this->drapeaux_list = array('en', 'fr');
        $this->drapeaux_list = array_keys(sfConfig::get('app_langues_interface',array()));
       
        # la route en cours est définie
        $current_route_pure = sfContext::getInstance()->getRouting()->getCurrentInternalUri();
       
        if ($request->getParameter('id')):
            $this->current_route = $current_route_pure.'&id='.$request->getParameter('id');
        else:
            $this->current_route = $current_route_pure;
        endif;
    }
Le composant "language" a été remplacé par le composant "drapeaux"

- Le composant inclut est donc appelé différemment dans le template général :  /apps/frontend/templates/layout.php
<?php include_component('language','drapeaux') ?>


Modifier appel au composant dans le layout
Le template correspondant au composant "language"  (/apps/frontend/modules/language/templates/_language.php) est remplacé par le template correspondant au composant "drapeaux" : /apps/frontend/modules/language/templates/_drapeaux.php.
Ce template doit prendre en compte la route actuelle :

<!-- boucle des formulaires-drapeaux -->
<?php foreach ($drapeaux_list as $drapeau): ?>
    <form action="<?php echo url_for('@language_change') ?>" id="<?php echo $drapeau ?>" class="container_drapeau" method="post">
       
        <input type="hidden" name="last_route" value="<?php echo $current_route; ?>">
        <input type="hidden" name="last_culture" value="<?php echo $sf_request->getParameter('sf_culture') ?>">
        <input type="hidden" name="new_culture" value="<?php echo $drapeau ?>">
        <input name="drapeau" type="submit" value="<?php echo $drapeau ?>" class="drapeau_<?php echo $drapeau ?>">
    </form>
<?php endforeach ?>

Créer une nouvelle route et une nouvelle action
On crée une nouvelle route dans /apps/frontend/config/routing.yml :

language_change:
  url: /language_change
  param: { module: language, action: languageChange }

Cette nouvelle route dirige vers une action (languageChange), on crée donc cette action dans /apps/frontend/modules/language/actions/actions.class.php :

 public function executeLanguageChange(sfWebRequest $request)
 {
     # change le language à l'aide de petits drapeaux
    
     # assigner une nouvelle culture au User
     $new_culture = $request->getParameter('new_culture');
    $this->getUser()->setCulture($new_culture);
   
   
    $last_route = $request->getParameter('last_route');
    $last_culture = $request->getParameter('last_culture');
    $new_route = str_replace('sf_culture='.$last_culture, 'sf_culture='.$new_culture, $last_route);
   
    # retour à la page quittée
    $this->redirect($new_route);
 }

Modifier TOUTES les routes existantes
- Toutes les routes du fichier /apps/frontend/config/routing.yml sont modifiées : On ajoute /:sf_culture en début.
Ex :

candidat_new:
  url: /candidat/new
  param: { module: candidat, action: new }
devient :

candidat_new:
  url: /:sf_culture/candidat/new
  param: { module: candidat, action: new }

Placer les drapeaux en CSS
On a créé des drapeaux (avec Photoshop ou Fireworks) carrés de 21px (par exemple...).
Ces drapeaux sont dans le dossier /web/boutons.
On renseigne les classes que l'onb a nommé dans le Template dans la feuille CSS incluse dans le layout :
 /*-- drapeaux --*/
 form.container_drapeau { float:left;}
 input.drapeau_fr, input.drapeau_en, input.drapeau_de
     { width:21px; height:21px; display:block; border:none; text-indent:-999px; font-size:0px;margin-right:10px;}
 input.drapeau_fr         { background: url(/boutons/drapeau_fr.gif) top left no-repeat; }
 input.drapeau_en         { background: url(/boutons/drapeau_en.gif) top left no-repeat; }
 input.drapeau_fr:hover { background: url(/boutons/drapeau_fr_f2.gif) top left no-repeat; }
 input.drapeau_en:hover { background: url(/boutons/drapeau_en_f2.gif) top left no-repeat; }
Nota : ces valeurs sont juste indicatives. On les modifie selon sa maquette.

++++++++++

Merci au livre "Mieux développer en php avec Symfony 1.2 et Doctrine" de Fabien Potencier et Hugo Hamon (éditions Eyrolles)

0 commentaires: