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 :

  1. <?php
  2. // lib/form/doctrine/TestForm.class.php
  3.  
  4. class TestForm extends BaseTestForm
  5. {
  6. public function configure()
  7. {
  8. $this->getWidgetSchema()->setFormFormatterName('table');
  9. }
  10. }
  11.  
  12. ?>

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 :

  1. <?php
  2. // lib/vendor/symfony/lib/widget/sfWidgetFormSchemaFormatterTable.class.php
  3.  
  4. class sfWidgetFormSchemaFormatterTable extends sfWidgetFormSchemaFormatter
  5. {
  6. protected
  7. $rowFormat = "<tr>\n <th>%label%</th>\n <td>%error%%field%%help%%hidden_fields%</td>\n</tr>\n",
  8. $errorRowFormat = "<tr><td colspan=\"2\">\n%errors%</td></tr>\n",
  9. $helpFormat = '<br />%help%',
  10. $decoratorFormat = "<table>\n %content%</table>";
  11. }
  12.  
  13. ?>

En regardant dans la classe parente sfWidgetFormSchemaFormatter on trouve ceci :

  1. <?php
  2. ...
  3. $rowFormat = '',
  4. $helpFormat = '%help%',
  5. $errorRowFormat = '%errors%',
  6. $errorListFormatInARow = " <ul class=\"error_list\">\n%errors% </ul>\n",
  7. $errorRowFormatInARow = " <li>%error%</li>\n",
  8. $namedErrorRowFormatInARow = " <li>%name%: %error%</li>\n",
  9. $decoratorFormat = '',
  10. $widgetSchema = null,
  11. $translationCatalogue = null;
  12. ...
  13. ?>

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 :

  1. <?php
  2. // lib/form/sfWidgetFormSchemaFormatterBr.class.php
  3.  
  4. class sfWidgetFormSchemaFormatterBr extends sfWidgetFormSchemaFormatter
  5. {
  6. protected
  7. $rowFormat = '<b>%label%</b>%error%%field%%help%%hidden_fields%<br />',
  8. $helpFormat = '<i>%help%</i>',
  9. $errorRowFormat = '<b><u>Errors:</u></b>%errors%',
  10. $errorListFormatInARow = '<i>%errors%</i>',
  11. $errorRowFormatInARow = '%error%<br />',
  12. $namedErrorRowFormatInARow = '%name%: %error%<br />',
  13. $decoratorFormat = '%content%';
  14. }
  15.  
  16. ?>

Puis m'en servir comme ceci :

  1. <?php
  2. // lib/form/doctrine/TestForm.class.php
  3.  
  4. class TestForm extends BaseTestForm
  5. {
  6. public function configure()
  7. {
  8. $this->getWidgetSchema()->setFormFormatterName('br');
  9. }
  10. }
  11.  
  12. ?>

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 :

  1. <?php echo $form ?>

$form est par défaut la variable contenant votre formulaire.