Navigation

Contactez-nous

Kitpages
17 rue de la Frise
38000 Grenoble
tel : 04 58 00 33 81

Par Boris Morel (twitter accountBorisMorel) Dernière mise à jour : 07 January 2013

Language switcher avec un référentiel de langues

Introduction

À la différence du premier language switcher, celui la fait appel à un référentiel de langues depuis la base de donnée. Cela évite d'avoir les langues en dure dans le code.

Ici nous allons utilisez une fonctionnalité Twig qui permet depuis un Twig d'appeler un controleur pour récupérer l'ensemble de langues.

Le controleur pour récupérer les langues

<?php
// BaseController.php

/**
* This function musn't have a route.
* The users' can't be access directly on this action.
*/

/**
 * @Template()
 * @return Doctrine_Collection $languages, Request $request 
 */
public function languagesAction(Request $request)
{
    $languages = $this->getDoctrine()
        ->getManager()
        ->getRepository("IMAGCallsBundle:Language")
        ->getLanguages()
        ;

     return array(
        'languages' => $languages,
        'request' => $request
    );
}

Le template twig associé au controleur

{% if request.get('_route') and request.get('_method') and "GET" in request.get('_method').methods %} {# If method is not GET the language switcher is hidden to prevent change the url on a post action #}

{% set actualLanguage = request.locale %}

{% set routeParams = request.get('_route_params') %}
<div class="languages">
  {% for language in languages %}
  <div class="language language-{{language.isoCode}}">
   

    {% if actualLanguage == language.isoCode %}
    <div class="language-current language-current-{{language.isoCode}}">
      <div class="flag flag-{{language.isoCode}}">
        <img src="{{ asset('bundles/imagbasecalls/images/'~language.isoCode~'.png') }}" alt="flag-{{language.isoCode}}" title="{{language.name}}" />
      </div>
      <div class="iso">
        {{ language.isoCode|capitalize }}
      </div>
    </div>
    {% else %}

    {% if routeParams['_locale'] is defined %}
    {%set routeParams = routeParams|merge({'_locale': language.isoCode}) %}
    {% endif %}
    
    <div class="language-available language-available-{{language.isoCode}}">
      <div class="flag flag-{{language.isoCode}}">
        <a href="{{ path(request.get('_route'), routeParams) }}"><img src="{{ asset('bundles/imagbasecalls/images/'~language.isoCode~'.png') }}" alt="flag-{{language.isoCode}}" title="{{language.name}}" /></a>
      </div>
      <div class="iso">
        <a href="{{ path(request.get('_route'), routeParams) }}">{{ language.isoCode|capitalize }}</a>
      </div>
    </div>

    {% endif %}
  </div>
  {% endfor %}
  <div class="clear"></div>
</div>
{% endif %}

L'inclusion du render dans le layout

{% block langue_switcher %}
    <div id="langue_switcher" class="span-9 pull-1 last">
        {% render "IMAGBaseCallsBundle:Base:languages" with {'request': app.request} %}
    </div>
{% endblock langue_switcher %}

A savoir

Si vous utilisez les "_internal" routes veuillez prendre connaissance de :

 

#Parts of Symfony web site

#You can check if you are using the internal routes easily by running the following command:

$ php ./app/console cache:clear
$ php ./app/console router:debug _internal

#If you have an error that says The route "_internal" does not exist., you are not vulnerable.

Commentaires

Ajouter un commentaire