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 :
<?php // lib/form/doctrine/TestForm.class.php class TestForm extends BaseTestForm { public function configure() { $this->getWidgetSchema()->setDefaultFormFormatterName('list'); } } ?>
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 :
<?php // apps/l_application/modules/le_module/templates/_form.php ?> <?php use_stylesheets_for_form($form) ?> <?php use_javascripts_for_form($form) ?> <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" ' ?>> <?php if (!$form->getObject()->isNew()): ?> <input type="hidden" name="sf_method" value="put" /> <?php endif; ?> <table> <tfoot> <tr> <td colspan="2"> <a href="<?php echo url_for('le_module/index') ?>">Back to list</a> <?php if (!$form->getObject()->isNew()): ?> <?php endif; ?> <input type="submit" value="Save" /> </td> </tr> </tfoot> <tbody> </tbody> </table> </form>
Observez le résultat... :)
Et recommencez avec tous vos autres modules... :(
form
My Life