Voilà, j'ai commencé à coder mon propre générateur+validateur de formulaire.
Je suis à des années-lumière de ce que peut faire Symfony, mais c'est un début qui ne demande qu'à être étoffé.
Bref, voici un peu de code:
Pour que ce soit plus lisible, j'ai omis la gestion des erreurs (try...catch). En pratique on est obligé, sinon ça peut générer des erreurs unhanddled promise rejection et à l'avenir ça fera direct crasher le serveur.
La génération sur la page affichant le formulaire :
routes.get('my-form', '/form', async function(req,res){
let form = ...
let data = ...
form.bind(data);
let gf = await form.generate();
res.render('member', { form: gf });
});
Avec form un objet Form (j'y viens), et data un objet provenant par exemple de la DB, pour préremplir les champs du formulaire avec les valeurs actuelles.
LE code HTML généré est hyper basique, mais le but final de ce côté-là est d'appeler le moteur de template via app.render.
Pour récupérer et valider loe formulaire en POST ça donne ça:
app.routes.post('/form', async function(req,res){
let form = ...
let data = ...
form.bind(data);
form.load(req.body);
if (await form.validate()) {
// Les données sont correctes, on peut update la base ou faire autre chose
// Ici pour l'exemple on retourne juste sur le formulaire
res.redirectTo('my-form');
}
else {
// Les données ne sont pas correctes, on réaffiche le formulaire avec les erreurs
let gf = await form.generate();
res.render('member', { form: gf });
}
});
La création du formulaire ressemble à ça:
let form = new Form();
form.add(new TextField({ name: 'name', label: 'Votre nom', validators: [notEmpty] }));
form.add(new Choice({ name: 'preferences', label: 'Vos choix', multiple: true, extended: true, validator: notEmpty, choices: [
{ value: 'IE', label: 'Internet Explorer' },
{ value: 'FFX', label: 'Firefox' },
{ value: 'GCHR', label: 'Google chrome' },
{ value: 'EDGE', label: 'Microsoft Edge' },
{ value: 'SAF', label: 'Safari' },
]}));
form.add(new TextArea({ name: 'comment', label: 'Votre commentaire', validator: notEmpty }));
form.add(new SubmitButton({ label: 'Valider' }));
ET l'objet data devrait ressembler à :
{ name: 'Jean-Pierre',
comment: 'Votre site est pourri !',
preferences: ['IE', 'GCHR', 'FFX']
}
Je me demande si je ne vais pas aussi m'essayer à faire mon propre moteur de template, juste pour m'amuser. Avec nunjucks je suis un peu coincé, je ne peux par exemple pas passer l'objet form directement et appeler form.generate() dans le code du template; et je trouve que c'est un peu dommage.
Ah oui, et comme tu peux le voir, je me plais beaucoup à essayer les dernières nouveautés comme async/await. C'est vraiment pratique une fois qu'on a compris le concept.