2013-01-03 5 views
3

J'ai une liste d'articles en tant que tableau html. Je veux avoir l'opportunité de sauvegarder certaines données en mode batch. Pour ce faire, je besoin de mes noms de champs de formulaire ressemble à ceci: fournisseur [i] [titre] etc. Mais lorsque je tente de créer champ de formulaire, je reçois une erreur:Noms de formulaire Symfony 2 pour les actions par lots?

forme nom de type ("fournisseur [0] ") n'est pas valide. Les noms ne doivent contenir que des lettres, des chiffres et "_".

J'ai des informations sur les collections de formulaires, mais ce n'est pas exactement ce dont j'ai besoin.

Je veux obtenir une forme entière en action tout comme $ request-> request-> get ('provider'), puis itérer pour obtenir des données réelles .. Je suis confus !! C'est la tâche la plus simple que je puisse imaginer.

<input type='text' name='provider[0][title]'> 
<input type='text' name='provider[1][title]'> 
<input type='text' name='provider[2][title]'> 

Je peux utiliser $ request-> request-> all(), c'est une solution, mais pas si élégante je pense. des idées?

Répondre

1

Il est tout à fait normal que vous ne puissiez pas nommer directement votre champ avec un nom comme "provider [0]". Cette partie du nom de champ est générée par Symfony.

Pour moi, le seul moyen (bon) de stocker plusieurs entités sous une forme est d'utiliser des collections. Ils sont bien expliqués dans la documentation de Symfony2: http://symfony.com/doc/current/cookbook/form/form_collections.html

Dans votre cas, il vous suffit de créer un formulaire avec un champ de collecte et d'ajouter une ligne dans votre contrôleur ou sur le vol avec javascript. Pour le champ "provider", créez simplement un formType avec un champ de texte. Si vous travaillez avec une matrice HTML, vous pouvez simplement ajouter une ligne pour chaque entité. Le fournisseur i dans le fournisseur [i] sera lié aux entités dans la base de données si elles ne sont pas liées à une autre entité. Enfin, l'utilisation de données POST n'est définitivement pas une bonne solution: vous perdrez l'assertion de champ de formulaire et la protection CSRF.

Questions connexes