Routing, multilingue, et urls !

17 views
Skip to first unread message

Sébastien Charrier

unread,
Jul 29, 2008, 3:41:51 AM7/29/08
to Cakephp-fr
Salut à tous,

Après avoir cherché (et sur le net, et dans le code de cake), je ne
trouve pas de solutions (propres !) concernant une problématique de
gestion des urls ... J'espère que l'un(e) d'entre vous saura
m'aiguiller !

Je travaille sur un projet important nécessitant multilingue, et url
friendly (référencement poussé). J'ai énormément de routes (environ
80) donc la moitié sont générées automatiquement. Concrètement :
- je gère la langue courante grâce à un paramètre :langue intégré dans
toutes mes routes avant tout le reste, ce paramètre étant transporté
automatiquement grâce à la surcharge de la méthode url() dans
app_helper ("if (!empty($this->params['langue']) => transport") ;
- beaucoup de routes sont paramétrées pour passer des paramètres aux
controllers. Exemple :
Router::connect('/:langue/:relais/
actu-:slug-:id',array('langue'=>null,'relais'=>null,
'controller'=>'actualites','action'=>'voir'),
array('pass'=>array('id','slug'), 'langue'=>$langues,'relais'=>
$relais, 'slug'=>'[a-zA-Z0-9\-]+','id'=>'[0-9]+'));

J'essaie de mettre en place des liens de changement de langue, qui
permettraient de switcher d'une langue à une autre en restant sur la
page courante, autrement dit de modifier la valeur du
paramètre :langue (ou de le supprimer si on est dans la langue par
défaut du site). L'objectif serait donc de récupérer l'url courante,
de la parser pour en extraire le paramètre langue, de le modifier,
puis de regénérer l'url avec chacune des langues que je veux rendre
disponible.

Je pensais utiliser Router::parse($this->here) pour récupérer l'url
courante. Il me retourne bien un array, avec le nom des paramètres
extraits grâce à la route, nom du controller, etc ...

Exemple :
Array
(
[pass] => Array
(
[0] => gastronomy
[1] => farm-produce
)

[named] => Array
(
)

[langue] => en
[relais] =>
[formuletype] => gastronomy
[formulename] => farm-produce
[plugin] =>
[controller] => pages
[action] => connaitre
[url] => Array
(
[ext] => html
)

)


Après avoir changé la langue, je pensais reconstruire mon url grâce à
Router::url($mon_tableau_modifie) ... Mais le format renvoyé par parse
n'est pas du tout compatible avec ce qu'attend url, pour plusieurs
raisons : url doit être supprimé, pass et named doivent être remontés
d'un niveau ... Et dans ce cas (en plus !), je devrais supprimer les
éléments qui sont dans "pass" puisqu'ils se retrouvent en plus dans le
premier niveau ! (formuletype et formulename). Je peux faire toutes
les vérifications/transformations manuellement, avec le risqu'en d'en
oublier la moitié, mais je me disais que les concepteurs de cake
devaient quand même bien avoir pensé à ce type de situation ...

Est-ce que quelqu'un aurait une petite idée pour extraire l'url
couorante / la modifier / la reconstruire après modification, sans
passer par autre chose que les outils de cake ?

D'avance, merci ! :)
Sébastien

Kalt

unread,
Aug 19, 2008, 4:22:11 AM8/19/08
to Cakephp-fr
$autres_langues = aa('en', 'English', 'de', 'Deutsch', 'es',
'Español');

// Dans le layout
foreach($autres_langues as $langue => $nom_langue)
{
$url_langue = $langue . substr($this->here, 0, 2);
echo $html->link($nom_langue, $url_langue);
Reply all
Reply to author
Forward
0 new messages