将选项数组添加为Symfony 2表单的复选框列表

时间:2013-07-17 10:20:27

标签: php forms symfony

我想做一些非常简单的事情(理论上; - )):

  1. 从数据库中选择一个选项列表
  2. 显示每个选项的复选框
  3. 为每个选定的选项执行某些操作
  4. 我正在使用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
                            )
    
    
      )
    );
    

1 个答案:

答案 0 :(得分:3)

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

您应该修改choices字段的choices_listitems选项。

请参阅choice field-type的文档。

如果multiple选项设置为true

,则选项字段将呈现复选框