2013-09-24 30 views
0

我有2個實體...Symfony2的嵌入式集合形式動態地創建新的實體

合同(ID,CLIENTNAME,contractCities)
ContractCity(ID,姓名)

合約都有一個一對多與ContractCities關係

oneToMany: 
    contractCities: 
    targetEntity: ContractCity 
    mappedBy: contract 
    cascade: [persist, remove] 


ContractCities與合同多對一關聯

manyToOne: 
    contract: 
    targetEntity: Contract 
    inversedBy: contractCities 
    joinColumn: 
     name: contract_id 
     referencedColumnName: id 

當編輯/創建我希望合同能夠動態地添加新的城市(超過3個最低限度的要求)。我已經嘗試遵循Symfony2的嵌入形式菜譜Here

合約類型表

->add('contractCities', 'collection', array(
      'type' => new ContractCityType(), 
      'allow_add' => true, 
      'allow_delete' => true, 
      'by_reference' => false 
      )) 

嫩枝模板的部分,以顯示城市形成

<ul class="contractCities" data-prototype="{{ form_widget(form.contractCities.vars.prototype)|e }}"> 
    {% for city in form.contractCities %} 
    <li> 
     {{ form_label(city, loop.index) }} 
     {{ form_widget(city.name, {'attr': {'placeholder' : 'City, State'} }) }} 
    </li> 
    {% endfor %} 
    </ul> 

一些控制器代碼到確保至少有3個城市字段

$cityCount = count($contract->getContractCities()); 
    if($cityCount <3) { 
     $needCities = 3 - $cityCount; 

     for($i=0; $i<$needCities; $i++){ 
      $city = new ContractCity(); 
      $city->setContract($contract); 
      $contract->addContractCity($city); 
      } 
    } 





    $form = $this->createForm(new ContractType, $contract); 

    $form->handleRequest($request); 

    if($form->isValid()) { 
     $em = $this->getDoctrine()->getManager(); 
     $em->persist($contract); 


     $em->flush(); 
     $id = $contract->getId(); 
     return $this->redirect($this->generateUrl('Intranet_contract_edit', array('id'=>$id))); 
    } 

當我點擊我的「新城」鏈接,在列表的底部出現時,我得到一個新的表單字段,並且可以輸入城市名稱。但是,在提交時似乎沒有發生。我可以編輯現有的城市,並保存更改,但是我添加的任何新城市都會消失。

我的理解是,應該調用Contract-> AddCity或 - > AddContractCity或這種性質的東西,但這似乎並未發生。任何想法我做錯了什麼?

UPDATE:當我提交表單我看不到額外的城市表示POST數據,爲首的谷歌了......

解決:當使用鉻查看源代碼'檢查元素'的原型領域之一,我注意到它顯示的形式結束標記過早呈現(雖然它看起來很好,當使用視圖源)。我使用form_start和form_end,但他們在不同的div(twitter bootstrap「rows」)。好像表單結束標記是在包含form_start的div的結束標記之前自動呈現的。我移動了form_start和form_end,以使它們成爲我視圖的最外層元素(將它們放在同一個「容器」div中),現在一切正常。跆拳道。

截圖視覺助手:http://imgur.com/hrgOV9T

回答

0

解決:當使用鉻「檢查元素」在原型領域之一查看源代碼,我注意到,這表明關閉標籤過早地呈現的形式(雖然它使用視圖源時看起來很好)。我使用form_start和form_end,但他們在不同的div(twitter bootstrap「rows」)。好像表單結束標記是在包含form_start的div的結束標記之前自動呈現的。我移動了form_start和form_end,以使它們成爲我視圖的最外層元素(將它們放在同一個「容器」div中),現在一切正常。跆拳道。

截圖視覺助手:http://imgur.com/hrgOV9T