Réflex ” Modèles, partie 2
Dans ma dernière entrée sur les modèles dans Réflex, j’ai parlé de comment les requêtes à la base de données sont construites pour correspondre aux besoins du modèle. Du point de vue du développeur d’application web, ça veux dire moins de code qui sert à contrôler l’affichage des pages. Ça donne aussi beaucoup de flexibilité au concepteur du modèle qui n’est plus limité par ce que le développeur d’application rend disponible au modèle. Mais ce principe du modèle qui crée la requête peut être poussé encore plus loin. Embarquons dans les formulaires!
Créer un formulaire c’est plutôt facile en HTML. Créer un formulaire qui fonctionne demande cependant une certaine compétence en programmation du côté serveur. Et bien, pas avec les modèles de Réflex. Écrivez votre formulaire tout comme vous l’auriez fait en HTML et il fonctionnera :
<rx:form>
<p>
<label>
Titre :
<rx:input type="text" source="entry/title"/>
</label><br />
<label>
Contenu :
<rx:textarea cols="80" rows="20" source="entry/content"/>
</label>
</p>
<p>
<rx:input type="submit" perform="update"/>
<rx:input type="submit" perform="delete"/>
</p>
</rx:form>
Notez les balises <rx:input>
et <rx:textarea>
. Elles possèdent les mêmes attributs que les balises HTML <input>
et <textarea>
, et seront rendu de cette façon au navigateur avec quelque transformations. Chacune recevra un attribut name
. L’attribut value
, du premier <input>
et le contenu du <textarea>
sera remplis avec les données indiqués par l’attribut source
.
L’élément <rx:form>
sera changé en un <form>
standard avec l’attribut action
menant vers la page courante et l’attribut method="post"
. Les deux derniers <rx:input>
ont l’attribut type="submit"
et seront affichés comme des boutons par le navigateur. Parce qu’ils n’en ont pas déjà, Réflex ajoute le texte à afficher sur les boutons (attribut value
).
Finalement, quand vous soumettez le formulaire, Réflex prend toutes les entrées et appelle l’action associée à l’attribut perform
du bouton sur lequel vous avez cliqué. Et voilà, vous avez mis à jour, ou effacé, votre entrée.
Mais un instant, n’est-ce pas totalement insécure? Et si je ne veux pas que personne n’efface mon entrée ? La réponse évidente serait « enlevons le bouton supprimer », ce qui évidemment ne fait rien pour empêcher un utilisateur malicieux de fausser les données de façon à faire effacer l’entrée même en l’absence du bouton. Vraiment ? Si vous enlevez le bouton appelant l’action « delete », Réflex n’acceptera plus d’effectuer cette action. C’est totalement WYSITFIAYCDWTF — What You See In The Form Is All You Can Do With The Form.
Ce n’est pas tout.
Supposons qu’on veuille éditer plusieurs entrées à la fois… c’est possible? Tout à fait, c’est aussi simple que si vous vouliez afficher toutes vos entrées sur la même page; placez les <rx:input>
dans une liste:
<rx:form>
<ul>
<rx:list source="weblog/entry" as="entry">
<li><rx:input type="text" source="entry/title"/></li>
</rx:list>
</ul>
<p><rx:input type="submit" perform="update"/></p>
</rx:form>
N’est-ce pas merveilleux? Notez qu’à la place d’écrire une balise <rx:list>
avec quelque attributs, j’aurais pu utiliser le raccourcis <rx:entry-list>
comme dans la partie 1.
Donc on peut créer à peu près n’importe quel genre de formulaire avec ce système de modèle. Ce qui est vraiment intéressant c’est qu’ils fonctionnent automatiquement. C’est aussi la base de toute l’interface d’administration de Réflex.
Vous aurez peut-être remarqué que tous ces exemples traitent d’entrées d’un blogue. Ce n’est pas limité à ça: tous les types de données peuvent être gérés de cette façon dans Réflex. Le stockage des données et le fonctionnement des actions sont définis par les modules. Ce sera le sujet de ma prochaine entrée sur Réflex.