Infocurci - programmatore Php Roma
Infocurci - programmatore Php Roma
"faster than 98% of all tested websites" (tools.pingdom.com) - 100/100 Google PageSpeed Insights - Benvenuti :)

Cms / framework : Come gestisce Joomla l'url rewrite?

Entriamo "dentro il cofano" di Joomla e vediamo cosa accade nel motore del cms quando è attivata la sovrascrittura delle url. Scopriremo cosi che creare un plugin per conto nostro non è poi impresa cosi complicata...

Cms / framework

Entriamo nel pannello di amministrazione di Joomla, dal menù System/Global configuration attiviamo, nella sezione "Seo settings", la voce "Search Engine Friendly URLs". 
Abbiamo cosi attivato le url cosidette "intelligenti",   quelle che trasformano un indirizzo
index.php?option=com_content&view=article&id=34
in
/basket/lebron-james.html
Ma cosa accade in Joomla affinchè le url vengano cambiate in questo modo? Dove è che il "motore" del cms si attiva per far si che l'indirizzo della pagina assuma una forma "umana" diventando cosi tanto caro ai Seo? :
In realtà le url non vengono gestite direttamente dal core del cms (quello dentro /libraries/joomla/ per capirci), ma da un plugin.
Il plugin è sef, si trova dentro /plugins/system, e già questo ci indirizza verso la giusta strada per la creazione di un nostro gestore di url personalizzato: ciò che va gestito sono gli eventi, in particolare "onAfterRender".
E qui abbiamo la prima sorpresa. Il gestore di url di Joomla altro non fà che un find/replace, magari in modo avanzato grazie alle espressioni regolari (in modo da intercettare tutte le url, comprese quelle degli eventi javascript), ma altro non è che una sostituzione di stringhe sul sorgente html della pagina.
L'evento onAfterRender, che non riceve nè restituisce parametri, viene chiamato quando la pagina è stata ormai completamente elaborata ma non è ancora inviata al browser.
Grazie all'istruzione
$app = JFactory::getApplication();
$buffer = $app->getBody();

abbiamo infatti a disposizione l'intero sorgente html della pagina, compresi i tag di apertura (head). Otto chiamate a preg_replace consentono di sostituire le url con quelle di sovrascrittura (si tratta di 8 chiamate diverse perchè non vanno gestiti solo i tag href classici, ma anche gli object, i param, gli eventi javascript ecc). Una callback iniziale sostituisce tutti i "&amp" con "&" in modo da avere una struttura omogenea, visto che le url Joomla vengon create dai vari componenti in tutti e due i modi.

Per creare un componente sef personalizzato, può bastare creare un plugin con l'evento onAfterRender() ed elaborare le nostre regexp sul $buffer creato nel modo che abbiamo appena visto.
Personalmente con un plugin del genere ho potuto gestire un dominio a cui erano associati diversi sotto-domini di terzo livello, ciascuno da attivare per pagine ben precise. Ho evitato cosi di installare sef di terze parti, che non sarebbero tornati utili all'esigenza del multi-dominio del mio cliente.