Un nouveau routeur pour Joomla!

17051 vues
30 novembre 2014
Cyril
joomla-seo

 

Le routeur de Joomla! va évoluer

Ah le fameux routeur de Joomla! Comme certains le savent peut être, au printemps de cette année Pulsar a été à l'initiative d'un important chantier de refonte du routeur du CMS Joomla! Pour information le routeur est un des éléments centraux essentiels du CMS puisqu'il est en charge de la bonne réécriture SEF des urls mais qu'il se base essentiellement sur les éléments de menus et les catégories Joomla!

Combien de fois avez-vous eu à expliquer à un client (ou simplement à vous même) pourquoi il doit y avoir ces nombres dans l'URL et ce qu'il en coute pour s'en débarrasser? Combien de fois avez vous découvert que des visiteurs ou des moteurs de recherche accèdent à un contenu donné avec des urls multiples ? 

Vous voudriez personnaliser les URLs de vos sites mais sans installer une extension SEO volumineuse ? Avez-vous essayé d'implémenter un routeur pour votre propre extension mais sans vraiment y arriver après vous etre arraché les cheveux à cause de la complexité de la tâche ?

 Joomla! est un CMS fabuleux et possède de bonnes, sinon les meilleures fondations pour les développeurs. Cependant il y a une zone sombre qui n'a pas vraiment changé depuis Joomla 1.0 et c'est bien le routeur. Il y a donc ces gênes comme les IDs dans les urls et les multiples URLs pour un même contenu. Enfin il est effectivement très difficile d'écrire un routeur efficace pour sa propre extension.

Un des exemples que nous rencontrons à Pulsar est l'articulation entre le routeur Joomla! avec Seblod. En effet il existe des cas où le routeur est pris en défaut et où il produit des URLs mauvaises. Bien sûr pour tous ces cas il y a surtout des bonnes pratiques dans l'organisation de sa navigation (ne pas oublier que Joomla! est piloté par les menus). Cependant la recherche avancée de Joomla! ne connait QUE les liens de menus Joomla! et non des extensions tierces. Un autre exemple est que les URLs produites par JCE ne connaissent aussi que les liens de menu Joomla standard avec les catégories Joomla.

Où sont les problèmes?

Le routage de Joomla présente donc quelques problèmes, déjà pour les internautes:

  • ID inutiles dans les URLs
  • Différentes URLs pour un même contenu (duplicate content!)
  • Parce que certaines Urls sont mauvaises de mauvais modules sont chargés
  • Pas de possibilité de personnaliser ses urls sans extension tierce (JoomSef, SH404, etc...)

Et pour les développeurs les problèmes sont:

  • Code non orienté objet, cette partie du code est encore en procédural
  • Un routeur pour un composant est extrêmement difficile à écrire, quasiment impossible pour des développeurs débutants
  • Des temps d'exécution plutôt longs

Avec Joomla! chaque composant reste responsable de la gestion de ses propres URLs SEF. Ainsi un développeur de composant doit créer son propre routeur (comme décrit sur http://docs.joomla.org/Supporting_SEF_URLs_in_your_component)

C'est quoi le plan ?

En 2013 Pulsar avait déjà fait évoluer le routeur de Joomal! pour les versions 2.5.17 et 3.2.1 de Joomla comme relaté dans ce billet

Au printemps 2014, nous avons initié une campagne INDIGOGO avec le développeur HANNES PAPENBERG qui est impliqué dans le projet Joomla! depuis 2005. Plus récemment il a contribué en fournissant le code de l'encodage Bcrypt de Joomla 3.3 qui remplace le MD5 pour accroitre le niveau de sécurité du CMS.

 L'objectif est de repenser la façon dont le routeur fonctionne et le rendre à la fois plus flexible et plus fiable. Hannes utilise un code qu'il a déjà écrit il y a quelques temps et qu'il a fait mûrir avec quelques itérations. Il ne partait pas d'une page blanche. Le nouveau schéma de routage corrigera tous ces problèmes avec lesquels nous vivons depuis quelques années et proposera de toutes nouvelles URLs. 

Et maintenant où en est-on ?

En octobre Hannes, qui s'excusait de ne pas trouver plus de temps à passer sur le projet, nous donnait quelques nouvelles en détail. Il explique qu'il se bagarre encore avec l'application router et sa retro compatibilité. En fait il a du modifier sa stratégie tant la tâche est importante. 

Hannes s'excuse d'une erreur qui a été comise dans ce projet car il dit avoir commencé par écrire les tests unitaires et ensuite seulement l'implémentation du nouveau code. Entre temps ces tests unitaires ont été acceptés par la CORE TEAM de Joomla! et le code du routeur actuel est maintenant complètement couvert par ces tests unitaires. Le future code bénéficiera de ces test. En même temps cela signifie que le nouveau code du routeur doit passer ces tests unitaires et ce n'est malheureusement pas le cas actuellement.

Le routeur actuel a un comportement plutôt erratique. Il prend un objet JUri que vous pouvez le modifier et en même temps il attend quelques variables à retourner dans un tableau associatif. A la fin certaines données qui sont extraites de l'URL sont dans l'objet JUri et d'autres dans le tableau associatif qui est retourné. Hannes a essayé de rendre ce comportement stable en forçant les règles du routeur à ne rien renvoyer et à la place transformer l'objet JURi étape par étape.

Voyez cela comme une chaîne d'assemblage sur un tapis roulant. A la première étape de l'analyse de l'URL (parsing), l'objet JURi arrive et les caractères spéciaux sont décodés, le domaine et le dossier de Joomla sont extraits. Toutes ces données sont écrites dans l'objet JURi. A l'étape suivante l'élément de menu est décodé et à nouveau on range l'itemid dans l'objet original et on retire l'information décodée. Ainsi l'objet se déplace le long de la chaîne d'assemblage jusqu'à ce que l'URL lisible par un humain soit décodée en quelque chose que Joomla! comprend. Cela ne sera cependant pas possible d'une façon véritablement retro-compatible en Joomla 3.x.

Une rupture de la retro-compatibilité n'affectera peut être que 1% de toutes les installations mais cela représenterait tout de même des dizaines de milliers d'instances Joomla, ce qui est un cul de sac. Donc la promesse d'une retro-compatibilité à 100% avec le nouveau routeur ne peut pas être tenue!

Par contre la bonne nouvelle est que cela n'affecte pas les routeurs des composants tiers. Puisque les routeurs des composants ont été basés sur deux fonctions magiques et que seulement le support de classes rudimentaires n'a été implémenté par Hannes dans Joomla 3.3, nous pouvons améliorer ces fonctions pour les rendre retro-compatibles. Cela signifie que nous pouvons avoir des routeurs plus concis et plus simples dans les prochaines versions de Joomla. Ça c'est le bon point!

 Et pour conclure ?

Pour résumer les travaux en cours: malheureusement le router principal (application router) ne peut être implémenté dans Joomla 3.3 sans casser la retro compatibilité et il faudra attendre Joomla 4.x pour réparer cette partie de Joomla! Hannes pense pouvoir proposer cependant une solution intermédiaire pour Joomla 3.x. Par contre les nouveaux routeurs de composants (qui sont en fait les plus intéressants) vont pouvoir être implémentés dans les toutes prochaines versions de Joomla (sous réserve d'acceptation).

La PLT (Production Lead Team) est en train de tester et de valider ces travaux et restés connectés sur notre blog pour avoir des nouvelles de cette avancée très importante de notre CMS préféré.