The 2007-11-15 at 18:07 by Loïc d'Anterroches filed under News.
Hier, je faisais savoir que je n’étais pas particulièrement heureux de la gestion des URLs dans Pluf, aujourd’hui, je viens donc de fixer le problème en utilisant encore une fois une approche similaire à celle de Django.
Si vous avez regardé le code du gestionnaire des choses à faire, vous avez pu constater que l’URL d’une vue est utilisée à plusieurs endroits :
Maintenant, la définition de cet URL est à un endroit unique, la correspondance vue <-> URL.
Prenons le cas de l’ajout d’une chose à faire, la vue correspond à la méthode addItem de la class Todo_Views. Et dans la correspondance vue <-> URL on a :
$ctl[] = array('regex' => '#^/list/(\d+)/item/add/$#',
'priority' => 4,
'base' => Pluf::f('todo_base'),
'model' => 'Todo_Views',
'method' => 'addItem');
L’URL en pratique n’est défini que par une expression régulière : #^/list/(\d+)/item/add/$#. Vous pouvez voir le parenthèse qui capture l’id de la liste dans laquelle la chose à faire va être ajouté. Quand je veux utiliser cet URL dans l’action de mon formulaire, je me retrouve avec cette expression régulière et l’id de la liste.
L’expression régulière ici est faite pour extraire l’id de la liste étant donné un URL. On a donc :
/list/23/item/add/ + regex = id de la liste (23)
Maintenant je veux :
/list/23/item/add/.
J’ai donc créé une fonction Pluf_HTTP_URL_buildReverseUrl($url_regex, $params=array()) qui, étant donné l’expression régulière de l’URL et les paramêtres qui seraient extraits par cette expression régulière, reconstitue l’URL.
Donc maintenant, pour obtenir l’URL d’une vue dans le code, je fais simplement :
$url = Pluf_HTTP_URL_urlForView('Todo_Views::addItem', array($list->id));
Cela va directement chercher l’expression régulière dans la définition des vues courantes et passer le tout à mon fonction qui va reconstituer l’URL. Dans un gabarit, c’est tout aussi simple :
<form method="POST" action="{url 'Todo_Views::addItem', array($list.id)}">
Le mieux maintenant, c’est que j’ai défini une fonction qui permet de prendre la correspondance vues <-> URLs d’une application, d’ajouter un préfixe et ainsi de pouvoir l’inclure au sein d’une autre application.
Si vous regardez maintenant le code de l’application exemple, il n’y a presque plus de redondance. La seule chose qui reste à faire, c’est d’extraire du modèle de données Todo_Item ou Todo_List un formulaire de création ou de modification. Pour le moment, il faut encore les définir manuellement et ce n’est pas bien. Voilà du travail pour demain !
Comments from readers
Joss said:
Et comment tu vois la chose dans une appli comme Plume où une catégorie n'est pas définie par un nombre mais par une chaîne de caractères pouvant contenir des "/" ?
zyegfryed said:
Nice shot ! Très beau boulot, ça donne envie.
Loïc said:
Pour Joss :
On peut aussi avoir une expression régulière qui contient des lettres, des mots, etc. La fonction inverse fonctionne pour toutes les formes d'expression régulières.