我有2个实体......
合同(id,clientName,contractCities)
ContractCity (id,name)
合同与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
ContractType表格
->add('contractCities', 'collection', array(
'type' => new ContractCityType(),
'allow_add' => true,
'allow_delete' => true,
'by_reference' => false
))
用于显示城市形式的Twig模板的部分
<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-&gt; AddCity或 - &gt; AddContractCity或那种性质的东西,但这似乎不会发生。知道我做错了吗?
更新:当我提交表单时,我没有看到其他城市显示在POST数据中,前往谷歌...
已解决:在其中一个原型字段中使用chrome'vising element'查看源代码时,我注意到它显示表单结束标记过早呈现(尽管它看起来很好使用视图源)。我使用的是form_start和form_end,但它们位于不同的div中(twitter bootstrap“rows”)。看起来表单结束标记正在包含form_start的div的结束标记之前自动呈现。我移动了form_start和form_end,以便它们是我视图中最外层的元素(将它们放在同一个“容器”div中),现在一切正常。 WTF。
屏幕截图视觉助手:http://imgur.com/hrgOV9T
答案 0 :(得分:0)
解决:在原型字段之一上使用chrome'vising element'查看源代码时,我注意到它显示表单结束标记过早呈现(尽管在使用视图源时看起来很好)。我使用的是form_start和form_end,但它们位于不同的div中(twitter bootstrap“rows”)。看起来表单结束标记正在包含form_start的div的结束标记之前自动呈现。我移动了form_start和form_end,以便它们是我视图中最外层的元素(将它们放在同一个“容器”div中),现在一切正常。 WTF。
屏幕截图视觉助手:http://imgur.com/hrgOV9T