Ajouter un tableau d'options dans la liste de case à cocher pour Symfony 2 formes
Je veux faire quelque chose de vraiment simple (en théorie ;-)):
- sélectionnez une liste d'options de la base de données
- afficher une case à cocher pour chacune des options
- faire quelque chose pour chaque options sélectionnées
Je suis à l'aide de Symfony 2.2.2.
C'est comment j'ai ajouter la liste de manière dynamique à la forme de l'objet:
//MyformType
public function buildForm(FormBuilderInterface $builder, array $options)
{
$formFactory = $builder->getFormFactory();
$builder->addEventListener(
FormEvents::PRE_SET_DATA,
function (\Symfony\Component\Form\FormEvent $event) use ($formFactory) {
$options = $event->getData();
$items = $options["items"];
foreach ($items as $item) {
$event->getForm()->add(
$formFactory->createNamed($item->getId(), "checkbox", false, array(
'label' => $item->getName()
)
)
);
}
}
);
}
public function getName()
{
return 'items';
}
Symfony génère du code HTML qui ressemble à ça:
<input type="checkbox" id="items_17" name="items[17]" value="1">
<input type="checkbox" id="items_16" name="items[16]" value="1">
Maintenant quand j'essaie d'enregistrer les données que je ne peux pas accéder à un élément "éléments" - Symfony déclenche une exception que l'enfant "articles" n'existe pas.
//controller action
...
if ($request->isMethod('POST')) {
$form->bind($request);
if ($form->isValid()) {
$form->get('items')->getData(); //exception: child 'items' does not exist
}
}
Ce que je fais mal?
Solution:
Comme indiqué par @nifr une liste de cases à cocher est ajouté dynamiquement comme ceci:
$items = array(1 => "foo", 2 => "bar");
$event->getForm()->add(
$formFactory->createNamed("selecteditems", "choice", null, array(
"multiple" => true,
"expanded" => true,
"label" => "List of items:",
"choices" => $items
)
)
);
OriginalL'auteur herrjeh42 | 2013-07-17
Vous devez vous connecter pour publier un commentaire.
Vous êtes en train d'ajouter plusieurs champs au lieu de simplement les options.
Vous devez modifier la
choices
ouchoices_list
option de votreitems
champ de la place.Consultez la documentation de choix de terrain de type.
Le champ de choix rendra cases à cocher si le
multiple
option est définie àtrue
OriginalL'auteur nifr