Forms symfony2嵌入式集合表单动态创建新实体

Forms symfony2嵌入式集合表单动态创建新实体,forms,symfony,dynamic,doctrine,formbuilder,Forms,Symfony,Dynamic,Doctrine,Formbuilder,我有两个实体 合同(id、客户名称、合同城市) 合同城市(id、名称) Contract与ContractCities之间有一种单一的关系 oneToMany: contractCities: targetEntity: ContractCity mappedBy: contract cascade: [persist, remove] 合同城市与合同有多个联系 manyToOne: contract: targetEntity: Contract

我有两个实体

合同(id、客户名称、合同城市)
合同城市(id、名称)

Contract与ContractCities之间有一种单一的关系

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

合同城市与合同有多个联系

manyToOne:
  contract:
    targetEntity: Contract
    inversedBy: contractCities
    joinColumn:
      name: contract_id
      referencedColumnName: id
在编辑/创建合同时,我希望能够动态添加新城市(超出最低要求3)。我试图遵循Symfony2嵌入式表单食谱

合同类型表格

->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>
显示城市表单的细枝模板部分

->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>
    {form.contractCities%}中的城市为%
  • {{form_标签(city,loop.index)} {{form_小部件(city.name,{'attr':{'placeholder':'city,State'}}}}}
  • {%endfor%}
一些控制器代码确保至少有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)));
    }
$cityCount=count($contract->getContractCities());
if($cityCount ADD合同城市($city);
}
}
$form=$this->createForm(新合同类型,$contract);
$form->handleRequest($request);
如果($form->isValid()){
$em=$this->getDoctrine()->getManager();
$em->persist($contract);
$em->flush();
$id=$contract->getId();
返回$this->redirect($this->generateUrl('Intranet_contract_edit',array('id'=>$id));
}
当我单击列表底部显示的“新建城市”链接时,我会得到一个新的表单字段,可以输入城市名称。但是,提交时似乎什么都没有发生。我可以编辑现有城市并保存更改,但我添加的任何新城市都会消失

我的理解是,合同->添加城市或->添加合同城市或类似性质的东西应该被称为,但这似乎没有发生。你知道我做错了什么吗

更新:当我提交表单时,我没有看到更多的城市出现在帖子数据中,指向谷歌

已解决:在一个原型字段上使用chrome“inspect element”查看源代码时,我注意到它显示表单结束标记被过早渲染(尽管在使用view source时看起来很好)。我使用的是表单开始和表单结束,但它们位于不同的div(twitter引导“行”)。似乎表单结束标记在包含表单开始的div的结束标记之前被自动呈现。我移动了表单开始和表单结束,以便它们是我视图的最外部元素(将它们放在同一个“容器”div中),现在一切正常。Wtf


屏幕截图视觉助手:

已解决:当在一个原型字段上使用chrome“inspect element”查看源代码时,我注意到它显示表单结束标记被过早渲染(尽管在使用view source时看起来很好)。我使用的是form_start和form_end,但它们位于不同的div中(twitter引导“行”)。似乎表单结束标记在包含表单开始的div的结束标记之前被自动呈现。我移动了表单开始和表单结束,以便它们是我视图的最外部元素(将它们放在同一个“容器”div中),现在一切都正常了。Wtf

屏幕截图视觉助手: