Un nouveau routeur pour Joomla!

Le routeur de Joomla! va évoluer

JOOMLA-SEOAh 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é. 



 

 

 

Commentaires 2

cyril

(website) le mercredi 3 décembre 2014 14:17

Début décembre de nouvelles informations positives sont arrivées: pas moins de 18 propositions d'améliorations de Joomla! sont issues de ce projet et 10 sont déjà intégrées au coeur du CMS:

Fixing canonical in SEF plugin - intégré
Removing unnecessary run of JRouter:arse() - intégré
Routing: Implementing an interface for component router rules - intégré
Finder: Fallback for routing is called with wrong parameters - intégré
Optimizing JComponentHelper::getComponent - intégré
JRouterInstallation:arse() made compatible with the interface - intégré
Initial codereview of languagefilter plugin - intégré
Routing: Adding application and menu objects to component routers - intégré
Routing: using the dependency injected $app and $menu in the core routers - intégré
Updating JComponentRouterRulesInterface - intégré
Tags: Fixing routing
Language: Refactoring the language system to simplify the code
Implementing a tree node interface
Routing: Implementing routing stages
ContentHelperRoute::getArticleRoute needs to be called with catid and language
Routing: Discover Itemid in Router for com_content
Routing: Discover Itemid in Router for com_contact
Routing: Discover Itemid in Router for com_newsfeeds

Au passage Hannes est en train de nettoyer la gestion du multi langues dans Joomla! en même temps qu'il effectue de profodn changements à l'intérieur du routeur Joomla!.
Un des principaux problèmes du routage Joomla! maintenant réside dans les classe *HelperRoute comme ContentHelperRoute. Ces classes effectuent des tâches qui devraient être faites par le routeur directement, précisément pour le calcul du bon Itemid. L'Itemid est une part majeure de l'URL et définie l'élement de menu sur laquelle l'élément de menu doit pointer définissant ainsi les modules qui doivent apparaître ou non sur la page (entre autres). Depuis Joomla 1.5 où elles ont été introduites ces classes *HelperRoute n'ont cessé de poser un problème. D'abord vous devez les utiliser correctement partout où vous créez une URL (ce qui est déjà en soi un souci car ContentHelperRoute::getArticleRoute doit être appelé avec le bon catid et la langue) et ensuite le routeur est ignorant de ces classes.
Elles sont nommées et appelées arbitrairement AVANT le routeur (qui commence quand JRoute::_() est appelé) et leur valeur de retour (normalement quelque chose comme: index.php?option=com_content&view=article&id=42:galaxy&catid=23&Itemid=15) est passé au routeur.

Maintenant, si vous avez une telle URL dans votre article, Joomla va la convertir correctement en une "bonne" URL. Si cependant vous changez l'élément de menu d'une façon ou une autre, ce lien ne sera plus le bon lien vers cet article. Si le lien fonctionne encore après est plus une question de chance. Dans tous les cas l'Itemid doit être clalculé dynamiquement par le routeur du composant. Avec la proposition "Language: Refactoring the language system to simplify the code" on peut maintenant déplacer cette partie depuis la classe HelperRoute dans le routeur du composant correspondant.
D'où les 3 autres propositions:
Routing: Discover Itemid in Router for com_content
Routing: Discover Itemid in Router for com_contact
Routing: Discover Itemid in Router for com_newsfeeds

Ces 3 tâches vont assurer que vos liens à travers votre site possèdent au moins un bon Itemid pour ces 3 composants (les autres suivront rapidement). Cela va aussi être bientôt généralisé de telle sorte que ce code ne devra pas être ajouté à chaque composant séparément, mais pourra être utilisé par tous les composants de Joomla, natifs ou des extensions tierces. Ce sera aussi la première règle de routeur de composant qui montre qui illustrera le nouveau système de routage.

S'il y a peu de chance que tous ces changements soient prêts pour la sortie imminente de Joomla 3.4.0, Hannes travaille dur pour obtenir un résultat à tester. Selon le retard plus on moins long de Joomla 3.4 un certain nombre de propositions seront déjà intégrées, le reste sera pour Joomla 3.5.

Début décembre de nouvelles informations positives sont arrivées: pas moins de 18 propositions d'améliorations de Joomla! sont issues de ce projet et 10 sont déjà intégrées au coeur du CMS: Fixing canonical in SEF plugin - intégré Removing unnecessary run of JRouter::parse() - intégré Routing: Implementing an interface for component router rules - intégré Finder: Fallback for routing is called with wrong parameters - intégré Optimizing JComponentHelper::getComponent - intégré JRouterInstallation::parse() made compatible with the interface - intégré Initial codereview of languagefilter plugin - intégré Routing: Adding application and menu objects to component routers - intégré Routing: using the dependency injected $app and $menu in the core routers - intégré Updating JComponentRouterRulesInterface - intégré Tags: Fixing routing Language: Refactoring the language system to simplify the code Implementing a tree node interface Routing: Implementing routing stages ContentHelperRoute::getArticleRoute needs to be called with catid and language Routing: Discover Itemid in Router for com_content Routing: Discover Itemid in Router for com_contact Routing: Discover Itemid in Router for com_newsfeeds Au passage Hannes est en train de nettoyer la gestion du multi langues dans Joomla! en même temps qu'il effectue de profodn changements à l'intérieur du routeur Joomla!. Un des principaux problèmes du routage Joomla! maintenant réside dans les classe *HelperRoute comme ContentHelperRoute. Ces classes effectuent des tâches qui devraient être faites par le routeur directement, précisément pour le calcul du bon Itemid. L'Itemid est une part majeure de l'URL et définie l'élement de menu sur laquelle l'élément de menu doit pointer définissant ainsi les modules qui doivent apparaître ou non sur la page (entre autres). Depuis Joomla 1.5 où elles ont été introduites ces classes *HelperRoute n'ont cessé de poser un problème. D'abord vous devez les utiliser correctement partout où vous créez une URL (ce qui est déjà en soi un souci car ContentHelperRoute::getArticleRoute doit être appelé avec le bon catid et la langue) et ensuite le routeur est ignorant de ces classes. Elles sont nommées et appelées arbitrairement AVANT le routeur (qui commence quand JRoute::_() est appelé) et leur valeur de retour (normalement quelque chose comme: index.php?option=com_content&view=article&id=42:galaxy&catid=23&Itemid=15) est passé au routeur. Maintenant, si vous avez une telle URL dans votre article, Joomla va la convertir correctement en une "bonne" URL. Si cependant vous changez l'élément de menu d'une façon ou une autre, ce lien ne sera plus le bon lien vers cet article. Si le lien fonctionne encore après est plus une question de chance. Dans tous les cas l'Itemid doit être clalculé dynamiquement par le routeur du composant. Avec la proposition "Language: Refactoring the language system to simplify the code" on peut maintenant déplacer cette partie depuis la classe HelperRoute dans le routeur du composant correspondant. D'où les 3 autres propositions: Routing: Discover Itemid in Router for com_content Routing: Discover Itemid in Router for com_contact Routing: Discover Itemid in Router for com_newsfeeds Ces 3 tâches vont assurer que vos liens à travers votre site possèdent au moins un bon Itemid pour ces 3 composants (les autres suivront rapidement). Cela va aussi être bientôt généralisé de telle sorte que ce code ne devra pas être ajouté à chaque composant séparément, mais pourra être utilisé par tous les composants de Joomla, natifs ou des extensions tierces. Ce sera aussi la première règle de routeur de composant qui montre qui illustrera le nouveau système de routage. S'il y a peu de chance que tous ces changements soient prêts pour la sortie imminente de Joomla 3.4.0, Hannes travaille dur pour obtenir un résultat à tester. Selon le retard plus on moins long de Joomla 3.4 un certain nombre de propositions seront déjà intégrées, le reste sera pour Joomla 3.5.

cyril

(website) le mardi 16 décembre 2014 21:51

Encore des nouvelles de Hannes en ce 16 décembre. Voici la traduction de http://joomlager.de/crowdfunding/10-more-progress:

Juste pour tenir tout le monde au courant. Depuis ma dernière mise à jour il y a 12 jours j'ai envoyé quelques nouvelles propositions et deux d'entres elles concernent le routeur. Non seulement cela mais il s'agit de propositions majeures qui représentent la substantifique moelle de tout le projet et qui sont les parties qui vont aider les développeurs de composants à écrire des des routeurs de composants de qualité en un rien de temps.

La première proposition est la PRD numéro #5444: Routing: Implementing JComponentRouterAdvanced. Cette proposition implémente une nouvelle classe de base pour les routeurs de composant qui permet le routage basé sur une règle. Elle contient pas mal d'abstraction. Les détails se trouvent dans la PR elle-même et donc je vous invite à vous y reporter et à la commenter.

La seconde est la PR #5446: Routing: JComponentRouterRulesMenu pour trouver le bon Itemid. Elles implémente la première règle du routeur qui rend de fait la classe *HelperRoute obsolete. Dans cette PR dans les instructions de test, vous pouvez voir comment vorte routeur devra être modifié pour tirer avantage de la proposition. Le code que j'ai fourni là sera aussi le code qui, à la fin, constituera votre routeur. Tout le reste peut être retiré.

Je suis actuellement très occupé, mais j'ai pensé vous tenir au courant et, j'espère, adoucir vos vacances :-)

Encore des nouvelles de Hannes en ce 16 décembre. Voici la traduction de http://joomlager.de/crowdfunding/10-more-progress: Juste pour tenir tout le monde au courant. Depuis ma dernière mise à jour il y a 12 jours j'ai envoyé quelques nouvelles propositions et deux d'entres elles concernent le routeur. Non seulement cela mais il s'agit de propositions majeures qui représentent la substantifique moelle de tout le projet et qui sont les parties qui vont aider les développeurs de composants à écrire des des routeurs de composants de qualité en un rien de temps. La première proposition est la PRD numéro #5444: Routing: Implementing JComponentRouterAdvanced. Cette proposition implémente une nouvelle classe de base pour les routeurs de composant qui permet le routage basé sur une règle. Elle contient pas mal d'abstraction. Les détails se trouvent dans la PR elle-même et donc je vous invite à vous y reporter et à la commenter. La seconde est la PR #5446: Routing: JComponentRouterRulesMenu pour trouver le bon Itemid. Elles implémente la première règle du routeur qui rend de fait la classe *HelperRoute obsolete. Dans cette PR dans les instructions de test, vous pouvez voir comment vorte routeur devra être modifié pour tirer avantage de la proposition. Le code que j'ai fourni là sera aussi le code qui, à la fin, constituera votre routeur. Tout le reste peut être retiré. Je suis actuellement très occupé, mais j'ai pensé vous tenir au courant et, j'espère, adoucir vos vacances :-)
Already Registered? Login Here
Guest
dimanche 26 janvier 2020

Image Captcha