Mon premier post sur Symfony :)

Aujourd'hui, j'ai voulu générer des formulaires Symfony en changeant leur Formatter. Par défaut, les formulaires sont mis en forme dans une table, mais Symfony dispose nativement de 2 formateurs : table et list. Je vais vous expliquer comment changer de mise en forme.

Pour changer de formateur, il suffit simplement de faire :

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

Ensuite, n'oubliez pas de regénérer vos modules en lançant par exemple cette task :

$ ./symfony doctrine:generate-module frontend test Test

Vérifiez le résultat et... ça ne fonctionne pas. Voilà quelle était ma surprise !

En réalité, Doctrine possède son propre template de génération de formulaire. Ces templates génèrent effectivement une mise en forme en table, même si on a bien spécifié list dans la classe de formulaire : dommage.

Je ne ferai pas le détail de ce fichier car cela parait très simple de le modifier. Il se trouve ici : lib/vendor/symfony/lib/plugins/sfDoctrinePlugin/data/generator/sfDoctrineModule/default/template/templates/_form.php

Après votre modification, relancez votre task et le tour est joué.

Oui mais heu... moi le list me suffit et je n'ai pas envie de regénérer mes modules.

Pas de problème, dans chaque _form.php concerné (apps/l_application/modules/le_module/templates/_form.php), enlevez le contenu du formulaire auto-généré (gardez les balises form, le début et la fin du tableau ainsi que les headers/footers du tableau) et remplacez par :

<?php echo $form ?>

Comme ceci :

  1. <?php
  2. // apps/l_application/modules/le_module/templates/_form.php
  3. ?>
  4. <?php use_stylesheets_for_form($form) ?>
  5. <?php use_javascripts_for_form($form) ?>
  6.  
  7. <form action="<?php echo url_for('le_module/'.($form->getObject()->isNew() ? 'create' : 'update').(!$form->getObject()->isNew() ? '?id='.$form->getObject()->getId() : '')) ?>" method="post" <?php $form->isMultipart() and print 'enctype="multipart/form-data" ' ?>>
  8. <?php if (!$form->getObject()->isNew()): ?>
  9. <input type="hidden" name="sf_method" value="put" />
  10. <?php endif; ?>
  11. <table>
  12. <tfoot>
  13. <tr>
  14. <td colspan="2">
  15. <?php echo $form->renderHiddenFields(false) ?>
  16. &nbsp;<a href="<?php echo url_for('le_module/index') ?>">Back to list</a>
  17. <?php if (!$form->getObject()->isNew()): ?>
  18. &nbsp;<?php echo link_to('Delete', 'le_module/delete?id='.$form->getObject()->getId(), array('method' => 'delete', 'confirm' => 'Are you sure?')) ?>
  19. <?php endif; ?>
  20. <input type="submit" value="Save" />
  21. </td>
  22. </tr>
  23. </tfoot>
  24. <tbody>
  25. <?php echo $form->renderGlobalErrors() ?>
  26. <?php echo $form ?>
  27. </tbody>
  28. </table>
  29. </form>

Observez le résultat... :)

Et recommencez avec tous vos autres modules... :(