Piste : • formulaire-de-news
Table des matières
Il y a deux manières de faire des formulaires : soit de manière classique, “à la main”, soit en utilisant le nouveau système de formulaire jForms. jForms s'occupe à la fois des traitements coté serveur des données reçues d'un formulaire (HTML ou service web) : création, sauvegarde, vérification des saisies, etc, et à la fois de la génération des formulaires HTML dans les templates.
Dans ce chapitre, on va utiliser la méthode “traditionnelle”, histoire de se familiariser avec les enchaînements d'actions et autres concepts de base de Jelix. Plus loin dans le tutoriel, nous vous montrerons comment utiliser jForms.
Le but de ce chapitre, va être de créer un simple formulaire afin d'enregistrer de nouvelles news.
Le template et les URLs ¶
En premier lieu, nous allons faire le template, très simplifié, que l'on stocke
dans le fichier actu.org/modules/news/template/newsform.tpl
:
<h1>Création d'une news</h1> <form action="{formurl 'news~default:createsave'}" method="POST"> {formurlparam} <table> <tr> <th><label for="sujet">Sujet</label></th> <td><input type="text" id="sujet" name="sujet" /></td> </tr> <tr> <th><label for="texte">Texte</label></th> <td><textarea id="texte" name="texte"></textarea></td> </tr> <tr> <th><label for="date">Date</label> (AAAA-MM-JJ)</th> <td><input type="text" id="date" name="date" /></td> </tr> </table> <div><input type="submit" value="Enregistrer"/> <a href="{jurl 'news~default:index'}">Annuler</a> </div> </form>
Rien de très complexe, au niveau HTML. Toutefois vous remarquerez l'usage de
nouveaux tags : {formurl}
, {formurlparam}
et {jurl}
. Quelques explications…
Dans Jelix, vous éviterez de mettre des URLs en dur dans les templates ou les
actions, pour des raisons de facilité de maintenance et d'évolution. Le système
d'URL de Jelix vous permet de centraliser toutes les URLs dans un fichier
app/system/urls.xml
(qui peut faire référence à des fichiers urls.xml présent
dans les modules).
Ainsi l'objet jUrl
et le tag {jurl}
vous permettent d'obtenir une URL en
donnant uniquement le nom de l'action et des éventuels paramètres.
Ainsi, pour le lien “Annuler”, l'URL générée sera
“/index.php/news/default/index”. Si vous changez l'emplacement de
index.php, ou si vous modifier l'url de l'action dans urls.xml (en mappant
news/list
sur l'action news~default:index
), vous n'aurez pas à modifier
vos templates.
On aurait pu utiliser le tag {jurl}
aussi sur la balise <form>
, mais
si l'URL contient des paramètres, il est préférable de les mettre dans des champs cachés. Cependant, si on
changeait la configuration sur le mapping URL, ce n'est pas forcé qu'il y ait
toujours ces paramètres. Aussi on utilise conjointement les plugins
{formurl}
et {formurlparam}
qui se chargeront eux même de décider ce
qu'il faut mettre dans l'attribut “action”, et ce qu'il faut mettre dans des
champs cachés.
Note : par défaut, {jurl}
, {formurl}
et {formurlparam}
échappe
correctement dans l'URL les caractères réservés en HTML/XML.
Affichage du formulaire ¶
On va créer une première action 'createform' dans le contrôleur “default” pour afficher un formulaire de saisie d'une nouvelle news.
function createform(){ $rep = $this->getResponse('html'); $rep->title = 'Saisie d\'une actualité'; $tpl = new jTpl(); $rep->body->assign('MAIN', $tpl->fetch('newsform')); return $rep; }
Pour accéder à cette page, on va rajouter un lien en bas dans le template listenews.tpl
:
<p><a href="{jurl 'news~default:createform'}">Ajouter une news</a></p>
Là encore, on utilise le tag {jurl}
.
Maintenant rafraîchissez la page de liste des news dans le navigateur ( http://localhost:8080/index.php ). Vous devriez avoir le lien “Ajouter une news”. Si vous cliquez dessus, le formulaire devrait s'afficher.
Sauvegarde des données ¶
Comme on l'a indiqué dans le formulaire, il nous faut maintenant créer une action 'default:createsave' de sauvegarde des données.
En premier lieu dans cette action, on récupère un record, que l'on rempli ensuite avec les données
envoyées par le formulaire. Les paramètres d'URL ($_GET
) ou postés ($_POST
),
sont accessibles via la méthode param()
des contrôleurs.
$news = jDao::createRecord('news~news'); $news->sujet = $this->param('sujet'); $news->texte = $this->param('texte'); $news->news_date = $this->param('date');
On récupère ensuite une factory de dao pour enregistrer le record.
$dao = jDao::get('news~news'); $dao->insert($news);
Enfin, on va rediriger vers la liste de news.
$rep = $this->getResponse('redirect'); $rep->action = 'news~default:index'; return $rep;
Cela donne au final :
function createsave(){ $news = jDao::createRecord('news~news'); $news->sujet = $this->param('sujet'); $news->texte = $this->param('texte'); $news->news_date = $this->param('date'); $dao = jDao::get('news~news'); $dao->insert($news); $rep = $this->getResponse('redirect'); $rep->action = 'news~default:index'; return $rep; }
Bien sûr, une bonne manière de développer ici serait de vérifier chaque paramètre avant de les enregistrer, afin de respecter les éventuelles règles de gestion qui s'applique à vos données. Par exemple, vérifier que le sujet et le texte ne sont pas vide, et que la date est au format correcte.
Vous pouvez maintenant utiliser le formulaire pour créer de nouvelles news.