我有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