XHTML.net

Technology talks by Loïc d’Anterroches

News, articles, PHP, scripts, XHTML/CSS, …

  1. Home
  2. News

Amélioration de la gestion des URLs dans Pluf

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 :

  • dans la correspondance vue <-> URL ;
  • dans les gabarits, quand vous voulez faire un lien vers une vue ou quand vous avez un formulaire et vous devez donner l’action ;
  • dans le code des vues, quand vous voulez rediriger vers une autre vue.

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 :

  • regex + 23 = /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.

Voice your ideas

It is painless and I try not to kill electrons in the process.


Your email is required but will not be shared nor displayed.


Do you think your comment will force me to write even better stuff next time? If so, you simply rock.


Logo of Plume CMS