VII. Création d'un CRUD▲
Nous avons vu dans un chapitre précédent, comment créer un formulaire simple. Cependant nous n'avons pas réalisé tout ce qu'une interface d'administration de données exige : vérification de la saisie, affichage des erreurs, affichage d'une liste de news avec des liens pour modifier, suppression, modification, etc.
Ce sont souvent des développements rébarbatifs, aussi Jelix propose une solution : un système de formulaires jForms, et un contrôleur générique pour faire du CRUD (Create/Read/Update/Delete).
VII-A. Création du formulaire jForms▲
On va d'abord créer un formulaire jForms. Il s'agit d'un fichier XML dans lequel on liste tous les champs de saisie du formulaire, ainsi que leur libellé, les éventuelles contraintes sur leur contenu, etc.
Il existe une commande jelix-scripts qui permet de créer un formulaire jForms à partir d'un DAO, et ça tombe bien, nous avons déjà un DAO pour les news. Allez dans le répertoire jelix-scripts et tapez la commande suivante :
php jelix.php createform news newsform news
createform prend trois arguments :
- le nom du module ;
- le nom du futur formulaire ;
- le nom du DAO.
Nous obtenons alors dans le fichier actu.org/modules/news/forms/newsform.form.xml :
<?xml version
=
"1.0"
encoding
=
"utf-8"
?>
<forms xmlns
=
"http://jelix.org/ns/forms/1.0"
>
<input ref
=
"sujet"
type
=
"string"
>
<label>sujet</label>
</input>
<input ref
=
"texte"
type
=
"string"
>
<label>texte</label>
</input>
<input ref
=
"news_date"
type
=
"date"
>
<label>news_date</label>
</input>
<submit ref
=
"submit"
>
<label>Enregistrer</label>
</submit>
</forms>
La commande génère un formulaire très basique qu'il faut la plupart du temps adapter, car le script ne peut pas tout deviner. Ici par exemple, il va falloir indiquer des libellés plus parlants. Dans d'autres cas, il vous faudra certainement changer le type de champs de saisie, etc.
Changeons les libellés, indiquons que tous les champs sont obligatoires et ajoutons une petite aide pour la date :
<?xml version
=
"1.0"
encoding
=
"utf-8"
?>
<forms xmlns
=
"http://jelix.org/ns/forms/1.0"
>
<input ref
=
"sujet"
type
=
"string"
required
=
"true"
>
<label>Sujet de la news</label>
</input>
<input ref
=
"texte"
type
=
"string"
required
=
"true"
>
<label>Contenu</label>
</input>
<input ref
=
"news_date"
type
=
"date"
required
=
"true"
>
<label>Date</label>
<hint>Le format de la date est aaaa-mm-jj</hint>
</input>
<submit ref
=
"submit"
>
<label>Enregistrer</label>
</submit>
</forms>
Notre formulaire est prêt à être traité. On devrait utiliser l'API de jForms pour le manipuler, mais dans notre tutoriel, le contrôleur générique va le faire pour nous.
VII-B. Création du contrôleur CRUD▲
Créons le fichier modules/news/controllers/admin.classic.php, et commençons à y écrire un contrôleur pour faire une gestion de news :
<?php
class
adminCtrl extends
jControllerDaoCrud {
}
?>
Le contrôleur n'hérite pas de jController, mais de jControllerDaoCrud. C'est un contrôleur qui contient un ensemble d'actions prédéfinies. Il suffit alors de compléter certaines informations dans ses propriétés pour que la gestion des news soit opérationnelle.
En principe, dans un premier temps, indiquer le dao et le formulaire à utiliser suffit :
<?php
class
adminCtrl extends
jControllerDaoCrud {
protected
$dao
=
'news~news'
;
protected
$form
=
'news~newsform'
;
}
?>
Lancez maintenant dans votre navigateur : http://localhost/jelix/actu.org/www/index.php?module=news&action=admin:index
Vous devriez obtenir… une page blanche !
En effet, le contrôleur CRUD s'attend à ce que la réponse HTML qu'il récupère est un objet déjà préparé par l'application, et disponible pour toutes les actions (comme il est indiqué sur la page de la personnalisation des réponses communes). Mais nous n'avons pas vu ça encore dans le tutoriel, il faut donc redéfinir une méthode du contrôleur pour préparer la réponse HTML.
Il s'agit de la méthode _getResponse, spécifique à jControllerDaoCrud. On va donc préparer un objet jResponseHTML en indiquant un titre de page, un template pour le body…
<?php
class
adminCtrl extends
jControllerDaoCrud {
protected
$dao
=
'news~news'
;
protected
$form
=
'news~newsform'
;
protected
function
_getResponse(){
$rep
=
$this
->
getResponse('html'
);
$rep
->
title =
"gestion des news"
;
$rep
->
bodyTpl =
"admin_news"
;
return
$rep
;
}
}
?>
Il ne faut pas oublier de créer le template que l'on vient d'indiquer, modules/news/templates/admin_news.tpl :
<h1>Gestion des news</h1>
{$MAIN}
<hr />
<div><a href="{jurl 'news~default:index'}">Retour à l'accueil</a></div>
Maintenant vous pouvez relancer http://localhost/jelix/actu.org/www/index.php?module=news&action=admin:index, et vous devriez voir la liste des news, avec des liens pour les modifier, les effacer, etc.
Vous pouvez personnaliser cet affichage, en fournissant les templates propres à l'édition, au listage, en indiquant le nombre d'items par page dans la liste des news etc.
VII-B-1. Note▲
Pour le cas où il n'y a pas de DAO ou de formulaire préexistant, il est possible en une seule ligne de commande de créer le dao, le formulaire et le contrôleur :
php jelix.php createdaocrud le_module le_nom_de_la_table
Et ensuite, on peut directement appeler la page correspondante site.com/index.php?module=le_module&action=default:le_nom_de_la_table pour voir le résultat.