Chapitre: jUrl : des URLs automatiques
« jKvDb : accéder à une base de type key/value | ^ Composants de jelix | jAuth : système d'authentification » |
− Table des matières
Jelix comporte un mécanisme qui permet de ne pas avoir à mettre les URLs concernant les actions, en dur dans les templates (ou ailleurs). Pour faire simple, il suffit de fournir le module, l'action, le type de requête et éventuellement d'autres paramètres et jUrl se charge de générer l'URL correspondante. À l'inverse, lors d'une requête, jUrl analyse l'URL pour en déduire le module, l'action et les paramètres, et ceci, indépendamment du type de requête.
Pour cette tâche jUrl se repose sur un "moteur d'URL".
Petit rappel sur les URLs ¶
Une URL est composée de différentes parties :
http://monsite.com/un/chemin/pointentree.php/path/info?param1=value1
un/chemin/pointentree
: correspond au chemin du point d'entrée/index
par exemple.php
- l'extension du point d'entrée. Elle est facultative si le multiview est activé dans apache
/path/info
- le pathinfo, partie complémentaire du chemin, ne correspondant pas à un chemin physique sur le disque.
?param1=value1
- les paramètres.
Le moteur d'URLs analyse le pathinfo et les paramètres pour déterminer les noms des module et action.
Note : il peut y avoir certaines options à activer dans apache ou nginx. Voir la section sur la configuration serveur.
Configuration générale ¶
La configuration de jUrl se fait dans la section urlengine
du fichier de
configuration dont voici les paramètres :
multiview
- Indique si le multiview est activé ou non dans apache. Cela indique alors au moteur d'URL de ne pas générer l'extension des points d'entrées (.php) lors de la création des URLs. On a ainsi des URLs un peu plus "propres".
basePath
- Chemin jusqu'au répertoire www, ou plutôt, la partie commune des chemins de tous
les points d'entrée. Il est déviné automatiquement par Jelix, mais pour
certains cas, il vous faut l'indiquer vous même. Ainsi, si vous accédez à
index.php avec l'URL
http://localhost/jelix/myapp/www/index.php
, alors le basePath sera :
basePath= /jelix/myapp/www/
Si par contre vous avez spécifié le documentRoot dans Apache/Nginx, pointant sur
jelix/myapp/www
, alors il sera égale à /
.
Attention, la valeur de basePath doit toujours commencer par un /
. Si vous
n'indiquez aucune valeur, Jelix essaiera de deviner le chemin de base par lui
même.
notfoundAct
- L'action à effectuer quand une URL ne correspond à rien.
Indiquez-la sous forme de sélecteur d'action:
module~action
. L'action indiquée devra correspondre à l'affichage d'une page d'erreur par exemple et renvoyer le code http 404.
Remarque : quand vous êtes en développement, veillez bien à configurer l'ecriture des erreurs dans un fichier de log, de manière à savoir si la page de cette action est affichée suite à une erreur ou non.
Configuration du moteur d'URLs ¶
Il faut indiquer au moteur d'URL, quelles URLs correspondent à quel contrôleur et méthode. En fait, il s'agit plus précisément de faire la correspondance entre un pathinfo et un contrôleur.
Il y a au moins une URL à spécifier : celle de la page d'accueil, donc avec un pathinfo="/".
Ceci se fait dans le fichier app/system/urls.xml
.
Voir la page concernant la configuration de ce fichier urls.xml.
Utilisation ¶
Vous devez éviter de mettre des URLs en dur dans votre code, dans vos modules. Sinon cela crée des dépendances et la portabilité de vos modules s'en trouve diminuée. Il est impossible alors d'utiliser le module pour plusieurs applications en même temps car les URLs peuvent être différentes en fonction de la configuration des applications. Et si le module est réutilisé ailleurs, il faudrait alors modifier les templates etc...
De plus, faire générer les URLs par Jelix vous permet de changer à loisir les URLs, sans avoir à changer quoi que ce soit dans vos templates et vos contrôleurs.
Les URLs doivent donc être construites par Jelix. Pour cela, vous avez deux outils à votre disposition.
jUrl::get() ¶
L'objet jUrl a une méthode statique, get()
, qui en fonction d'une action et
d'autres paramètres, renvoie l'URL correspondante pour l'application courante :
$string_url = jUrl::get("news~view@classic", array("id_news"=>"54"));
Le premier paramètre de la fonction est donc un sélecteur d'action. Ici on
demande l'URL qui correspond à l'action view du module news, pour le type de
requête classic avec un paramètre id_news. Par défaut, si rien n'est
définie pour ce sélecteur d'action dans le fichier urls.xml, l'URL
correspondante ressemblera à cela : index.php/news/default/view?id_news=54
.
jUrl::getFull() ¶
Cette méthode fonctionne à l'identique de jUrl::get()
, à ceci près qu'elle
renvoi une URL complète, avec le protocole et le nom de domaine.
$string_url = jUrl::getFull("news~view@classic", array("id_news"=>"54"));
Renvoi une url ressemblant à https://monsite.com/index.php/news/default/view?id_news=54
.
Plugin de template jurl ¶
Dans les templates vous pouvez utiliser le plugin jurl. Sa syntaxe est identique
à jUrl::get()
. Exemple :
<p><a href="{jurl 'news~view@classic', array('id_news'=>'54')}">Détails de la news</a></p>
Le résultat sera alors :
<p><a href="index.php/news/default/view?id_news=54">Détails de la news</a></p>
Vous pouvez utiliser {jfullurl}
au lieu de {jurl}
pour avoir une url
complète avec le nom de domaine. Cela est utile par exemple dans les templates
de mail.