Pour compléter ce que je disais l'autre jour sur les formulaires. Je disais qu'il était possible de choisir la mise en forme des formulaires comme ceci :
<?php // lib/form/doctrine/TestForm.class.php class TestForm extends BaseTestForm { public function configure() { $this->getWidgetSchema()->setFormFormatterName('table'); } } ?>
Ici, on un formulaire Test utilisant le formatter table qui est le formatter par défaut dans Symfony.
Il existe nativement dans Symfony deux formatters :
- list
- table
Mais libre à vous d'en définir d'autres ! Ci-dessous, le formatter table de Symfony :
<?php // lib/vendor/symfony/lib/widget/sfWidgetFormSchemaFormatterTable.class.php class sfWidgetFormSchemaFormatterTable extends sfWidgetFormSchemaFormatter { protected $rowFormat = "<tr>\n <th>%label%</th>\n <td>%error%%field%%help%%hidden_fields%</td>\n</tr>\n", $errorRowFormat = "<tr><td colspan=\"2\">\n%errors%</td></tr>\n", $helpFormat = '<br />%help%', $decoratorFormat = "<table>\n %content%</table>"; } ?>
En regardant dans la classe parente sfWidgetFormSchemaFormatter on trouve ceci :
<?php ... $rowFormat = '', $helpFormat = '%help%', $errorRowFormat = '%errors%', $errorListFormatInARow = " <ul class=\"error_list\">\n%errors% </ul>\n", $errorRowFormatInARow = " <li>%error%</li>\n", $namedErrorRowFormatInARow = " <li>%name%: %error%</li>\n", $decoratorFormat = '', $widgetSchema = null, $translationCatalogue = null; ... ?>
On peut s'apercevoir ici que Symfony prédéfinit un certain nombre de paramètres qu'il n'est pas toujours utile de redéfinir dans notre classe fille.
Exemple bidon !
Pris d'un élan de fainéantise et de ce fait, peu inspiré, je veux faire un formulaire formaté uniquement avec des retours chariot (<br />) et des balises de formatage sataniques : <u></u>, <b></b>, <i></i>.
Je peux pourrais par exemple créer ceci :
<?php // lib/form/sfWidgetFormSchemaFormatterBr.class.php class sfWidgetFormSchemaFormatterBr extends sfWidgetFormSchemaFormatter { protected $rowFormat = '<b>%label%</b>%error%%field%%help%%hidden_fields%<br />', $helpFormat = '<i>%help%</i>', $errorRowFormat = '<b><u>Errors:</u></b>%errors%', $errorListFormatInARow = '<i>%errors%</i>', $errorRowFormatInARow = '%error%<br />', $namedErrorRowFormatInARow = '%name%: %error%<br />', $decoratorFormat = '%content%'; } ?>
Puis m'en servir comme ceci :
<?php // lib/form/doctrine/TestForm.class.php class TestForm extends BaseTestForm { public function configure() { $this->getWidgetSchema()->setFormFormatterName('br'); } } ?>
Notez que le simple fait de nommer la classe du formatter sfWidgetFormSchemaFormatterBr (c'est-à-dire sfWidgetFormSchemaFormatterFormatterName) suffit à le nommer "br".
Dernier petit détail
Inutile de vous fatiguer a re-générer 36 000 fois votre module ni d'effacer le cache ! Comme expliqué dans l'article précédent, Doctrine utilise ses propres templates de génération pour les formulaires.
La solution est de supprimer le contenu de votre formulaire (gardez les balises <form> - </form>, ainsi que les boutons du formulaire) et de le remplacer par :
où $form est par défaut la variable contenant votre formulaire.
My Life