Afficher un champ en lecture seul dans un formulaire

Vendredi, 03 Septembre 2010 09:29 Michel Rotta
Imprimer

Afficher un champ en lecture seul dans un formulaire.

C'est une question qui revient régulièrement sous symfony et qu'il n'est pas évident de traiter. Comment afficher une donnée en lecture seul.

 

En effet, en règle générale, on va essayer de torturer les pauvres widget, qui n'ont pas été conçu pour cela, pour afficher la donnée.

La première idée étant de positionner la propriété "readlonly" de (x)HTML. Ceci fonctionne très bien, à la première lecture du formulaire, mais, horreur, les données disparaissent lors d'un ré affichage lié à une erreur de saisie dans un champ libre de saisie.

En fait, il n'y a pas de solution simple au niveau du formulaire ("form") de symfony, la meilleur solution étant de réécrire le formulaire "à la main".

Au niveau de la méthode "executeEdit" correspondant au formulaire il n'y a rien de particulier à dire, elle se doit d'initialiser le formulaire et de récupérer les données de l'enregistrement.

C'est dans le template que tous va ce jouer, il faut le faire "presque" à l'ancienne. Il faut construire entièrement le tableau "à la main".

L'exemple de template suivant va nous afficher deux champs, un champ nom, qui sera modifiable et soumis à un "validator" dans le "form" de symfony et un champ commentaire qui ne sera qu'afficher et non modifiable pour l'utilisateur. Les lignes en gras seront commentées ci-dessous.

<h1>Exemple d'affichage sans modification</h1>
<form id="saisie" action="<?php echo url_for('@profil_update') ?>" method="post" >
<?php echo $form->renderHiddenFields() ?>
<table>
<tr>
<?php if ($form->hasGlobalErrors()): ?>
<td colspan="2">
<?php echo $form->renderGlobalErrors() ?>
</td>
<?php endif ; ?>
</tr>
<tr><?php echo $form['nom']->renderRow() ?></tr>
<tr>
<th><?php echo $form['commentaire']->renderLabel() ?></th>
<td class="disabled"><?php echo $form->getObject()->getCommentaire() ?></td>
</tr>
<tr>
<td colspan="2">
<input type="submit"
value="Enregistrer"
title="Enregistrez vos modifications" />
</td>
</tr>
</table>
</form>

ATTENTION ! Pour éviter tout envoi intempestif de données par un utilisateur mal intentionné sur le champ commentaire il convient de supprimé le validateur dans l'objet "form", ainsi, une donnée supplémentaire générerait un message d'erreur sur un champ qui n'existe pas (et qui apparaitrait dans les erreur global, ce qui en justifie l'initialisation dans le formulaire.

Mise à jour le Vendredi, 03 Septembre 2010 10:01