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

4

您正在添加多个字段,而不仅仅是选项。

您应该改为修改字段的choicesorchoices_list选项。items

请参阅选择字段类型的文档。

multiple如果选项设置为,则选择字段将呈现复选框true

于 2013-07-17T12:06:45.157 回答