Voilà un moment que j'ai un problème avec la validation des forms avec symfony 1.2. Tout marche très bien lorsqu'il s'agit d'afficher une page contenant uniquement un formulaire. Cependant, les choses se compliquent un peu quand la page dans laquelle est affichée le formulaire contient d'autres données que le-dit formulaire.
En effet, une redirection vers cette page, afin d'appeler l'action permettant de la charger, remet les champs du formulaire à zéro...
La plupart des solutions que j'ai pu trouver sur le net consiste alors à mettre en session les erreurs via le système de flash, afin de les ré afficher dans la page. Bien qu'opérationnelle, cette solution s'avère fastidieuse dès lors que le formulaire contient un grand nombre de champs.
La solution que j'ai employée consiste à appeler la même action afin d'afficher la page et de valider le formulaire. L'astuce consiste à traiter le chargement de la page en fonction du type de requête : post ou get.
Dans le fichier actions.class.php :
public function executeShow(sfWebRequest $request)
{
$this->anObject = $this->getRoute()->getObject();
$this->form = new myForm();
// si un formulaire a été soumis
if ($request->isMethod('post'))
{
// on récupère le formulaire soumis
$this->contact_form->bind($request->getParameter($this->form->getName()), $request->getFiles($this->form->getName()));
if($this->form->isValid())
{
//traitement du formulaire
}
}
}
Il suffit alors d'afficher le formulaire normalement dans le template :
<div id="form">
<form name="form" action="<?php echo url_for('@module_show') ?>" method="post">
<table>
<tfoot>
<tr><td><input type="submit" value="Send"/></td></tr>
</tfoot>
<tbody>
<?php echo $form ?>
</tbody>
</table>
</form>
<?php endif; ?>
</div>
Cette solution pose cependant 2 problèmes :
Le premier étant qu'il n'est plus alors possible d'actualiser la page sans renvoyer les données du formulaire, à moins d'entrer à nouveau l'url dans la barre de navigation.
Le deuxième intervient lorsqu'il y a plusieurs formulaires sur la même page, car un seul formulaire peut être validé.