2015-05-13 73 views
2

我有一個簡單的表單,其中包含項目集合。就像這裏所描述的: http://symfony.com/doc/current/cookbook/form/form_collections.htmlsymfony表單集合中的空元素

問題是,當我添加新元素(或多個元素)而不觸及它們(不改變它們的輸入)時,我得到一個空集合。

我想得到一個添加元素的集合,無論他們的內容如何。即使這些字段是空的,它也可以。

在表單提交後,我的情況,我有:

var_dump($request->get('my_form_name')); 

/* dump result: 
array (size=19) 
    ... 
    'partners' => 
    array (size=1) 
     0 => 
      array (size=2) 
      'fullname' => string '' (length=2) 
      'manager' => string '' (length=0) 
    ... 
*/ 

var_dump($form->getData()->getPartners()); 
// EMPTY!!! WTF? I expect an array of 1 element of Partner class which fields are set to '' and '' 

在另一方面,如果somethig設置,那麼它是確定:

var_dump($request->get('my_form_name')); 

/* dump result: 
array (size=19) 
    ... 
    'partners' => 
    array (size=1) 
     0 => 
      array (size=2) 
      'fullname' => string ' NAME HERE ' (length=2) 
      'manager' => string '' (length=0) 
    ... 
*/ 

var_dump($form->getData()->getPartners()); 
// ok, we have an array of 1 element which is an object of Partner class 

任何想法如何擺脫錯誤的?

/////////修訂///////// 合作伙伴的類映射爲:

Bundle\Entity\Partner: 
    ... 
    fields: 
    fullname: 
     type: string 
     lenght: 255 
     nullable: True 
    manager: 
     type: string 
     lenght: 255 
     nullable: True 
    manyToOne: 
    owner: 
     targetEntity: Step2 
     inversedBy: partners 
     joinColumn: 
     name: owner_id 
     referencedColumnName: id 

場「合作伙伴」被添加到「第二步」實體形式like'collection'with'allow_add','allow_delete','by_reference'= false

+0

您是否將「合作伙伴」類與您的表單關聯?如果是的話,你的'夥伴'實體類的'全名'屬性有哪些註釋? –

+0

我更新了我的問題以提供更多信息 – VladRia

+0

您能否顯示您的表單代碼?看起來你已經設置了'mapped => false'選項。 –

回答

0

好的,我發現了一個問題。

我必須在子表單中設置empty_data合作伙伴類)。


我不明白爲什麼,但在相關類(合作伙伴)的各個領域都提交給被""(空),然後在Symfony\Component\Form\Form類塊的方法sumbit

  if (FormUtil::isEmpty($viewData)) { 
       $emptyData = $this->config->getEmptyData(); 

       if ($emptyData instanceof \Closure) { 
        /* @var \Closure $emptyData */ 
        $emptyData = $emptyData($this, $viewData); 
       } 

       $viewData = $emptyData; 
      } 

null在$ viewData合作伙伴空字段。對於提交的對象是合作伙伴至少有一個字段不爲空$viewData是需要的對象。


所有這一切都是因爲

$this->config->getEmptyData() 

空對象是Closure最終結果null,但Partner與至少一個字段不爲空,它提供了直接需要的對象。

1

您需要將第二個參數傳遞給submit()方法爲false。它會說,提交空數據的Form組件不能改變任何現有的數據。

$form->submit($request->get('my_form_name'), false); 
+0

這應該起作用。我不知道這個'submit'的第二個參數。通常我使用'handleRequest'。我想有沒有辦法仍然使用'handleRequest'呢? – VladRia

+0

不需要。您需要使用提交。 'handleRequest()'只需調用'submit()'從Request接收的數據。 –