2013-07-17 31 views
4

我想要做的很簡單的東西(理論上;-)):添加的選項複選框列表陣列Symfony的2種形式

  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"> 

現在,當我嘗試保存提交的數據,我可以無法訪問元素「項目」 - Symfony會拋出子項'不存在的異常。

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


) 
); 

回答

3

你添加多個領域,而不是僅僅的選項。

您應該修改items字段的choiceschoices_list選項。

請參閱choice field-type的文檔。

選擇字段,如果multiple選項設置爲true

+2

說明(爲任何人在解決其他興趣)會使複選框:你必須同時設置多個,並擴大到真正拿到複選框 – herrjeh42