(version de Jelix supportée 1.1.x)
Ce petit article aborde 2 points du moteur d'URLs,
Classiquement, pour ajouter un lien dans une page, on se contente de faire des URLs manuellement comme suit :
<a href="/mon/chemin/vers/mon/lien/interne" title="mon lien tout pas beau">MonBeauSite</a>
Ce pendant si vous installez cette application dans un environnement dont le chemin est différent, un clic sur le lien aboutira sur une page 404.
Pour éviter l'avatar précédent, jUrl fait son oeuvre de façon tout à fait simple, comme suit :
<a href="{jurl 'news~default:index',array('parm1'=>'value1')}">MonBeauSite</a>
où news est mon module, default est mon contrôleur, et index ma méthode.
ce qui génèrera l'url http://localhost/index.php?module=news&action=default:index&parm1=value1
Mais il y a bien évidemment moyen d'avoir des URLs beaucoup plus “propres” (voir ci-dessous)
Une autre façon de procéder est d'utiliser jUrl dans son contrôleur et d'assigner le résultat au template :
function index() { $rep = $this->getResponse('html'); $monUrl = jurl::get('module~controlleur:action',array('parm1'=>'value1')); $tpl = new jTpl(); $tpl->assign('monurl',$monurl); $rep->body->assign('MAIN', $tpl->fetch('mon_template'); return $rep; }
<a href="{$monurl}">MonBeauSite</a>
Cas concret de cette utilisation au travers du controleur :
l'utilisation de script AJAX ayant bien évidemment besoin d'une url pour envoyer les données au serveur.
Dans le template quand nous codons le javascript nous mettons entre {literal}…{/literal} le code javascript que jelix ne doit pas interpreter.
Par conséquent l'URL ne peut être dynamiquement allouée à notre template, il faut donc générer le code javascript dans sa méthode avec l'URL qui elle sera bien issue de jUrl().
voici ce que cela donne par exemple pour un champ de recherche dynamique :
$url = jUrl::get('hfnusearch~default:queryajax'); $javascript = "<script type=\"text/javascript\">"."\n". "//<![CDATA["."\n". "$().ready(function() {"."\n". "\t"."$(\"#hfnu_q\").autocomplete('".$url."', {"."\n". "\t\t"."width: 300,"."\n". "\t\t"."multiple: true,"."\n". "\t\t"."matchContains: true,"."\n". "\t"."});"."\n". "});"."\n". "//]]>"."\n". "</script>"."\n"; $tpl->assign('javascript',$javascript);
{$javascript} ...
ce qui donnera dans la page html :
<script type="text/javascript"> //<![CDATA[ $().ready(function() { $("#hfnu_q").autocomplete('http://localhost/index.php?module=hfnusearch&action=default:queryajax', { width: 300, multiple: true, matchContains: true, }); }); //]]> </script>
A présent un autre aspect du moteur d'URLs de Jelix est son type.
Le type de moteur simple
produit des URLS de la forme (pour reprendre l'exemple précédant)
http://localhost/index.php?module=news&action=default:index&parm1=value1
Le type de moteur basic_significant
produit des URLs à la Cake
exemple :
http://localhost/index.php/news/default/index?parm1=value1
c'est-à-dire :
http://localhost/index.php/module/contrôleur/methode?parm1=value1
Le dernier type de moteur existant est le type significant
produisant l'url suivante :
résultat beaucoup plus concis et clair pour trouver la news “value1” ;)
Le dernier (significant) utilise, de plus, un fichier ursl.xml permettant d'indiquer à Jelix la concordance entre une URLs et les modules.
Ainsi pour l'url : http://localhost/news/value1, le fichier urls.xml ressemblerait à :
<?xml version="1.0" encoding="UTF-8"?> <urls xmlns="http://jelix.org/ns/urls/1.0"> <classicentrypoint name="index" default="true" noentrypoint="true"> <url pathinfo="/news/:parm1" module="news" action="default:index"> <param name="parm1" type="string"/> </url> </classicentrypoint> </urls>
basic_significant
représente un très bon ratio temps passé / qualité des URLs générées significant
est un peu plus délicat à gérer car il faut écrire TOUTES les urls, au risque de voir certaines complétement inopérantesjUrl est donc l'outil indispensable pour la portabilité de ses applications dans des environnements hétérogènes et d'une très grande souplesse de mis en oeuvre.