4

本当に簡単なことをしたい(理論的には;-)):

  1. データベースからオプションのリストを選択する
  2. 各オプションのチェックボックスを表示する
  3. 選択したオプションごとに何かをする

Symfony 2.2.2 を使用しています。

これは、リストを動的にフォーム オブジェクトに追加する方法です。

// 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 は次のような HTML を生成します。

<input type="checkbox" id="items_17" name="items[17]" value="1">
<input type="checkbox" id="items_16" name="items[16]" value="1">

送信されたデータを保存しようとすると、要素 "items" にアクセスできません - Symfony は、子の "items" が存在しないという例外をスローします。

// controller action
...
if ($request->isMethod('POST')) {
  $form->bind($request);
  if ($form->isValid()) {
    $form->get('items')->getData(); // exception: child 'items' does not exist
  }
}

私は何を間違っていますか?

解決策:

@nifr で概説されているように、チェックボックスのリストは次のように動的に追加されます。

$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
                        )


  )
);
4

1 に答える 1