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 ;-)):

  1. sélectionnez une liste d'options de la base de données
  2. afficher une case à cocher pour chacune des options
  3. 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