0

我有2个实体...

合同(id, clientName, contractCities)
ContractCity (id, name)

Contract 与 ContractCities 具有 oneToMany 关系

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


ContractCities 与合同的多对一关联

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
            ))

用于显示城市表格的 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->AddCity 或 ->AddContractCity 或类似性质的东西,但这似乎没有发生。知道我做错了什么吗?

更新:当我提交表单时,我没有看到 POST 数据中显示的其他城市,前往谷歌...

已解决:在使用原型字段之一上的 chrome 'inspect element' 查看源代码时,我注意到它显示表单关闭标记过早呈现(尽管在使用视图源时看起来很好)。我使用的是 form_start 和 form_end,但它们位于不同的 div 中(twitter bootstrap “rows”)。似乎表单结束标记在包含 form_start 的 div 的结束标记之前自动呈现。我移动了 form_start 和 form_end ,使它们成为我视图中最外层的元素(将它们放在同一个“容器”div 中),现在一切正常。重量级

截图视觉助手:http: //imgur.com/hrgOV9T

4

1 回答 1

0

已解决:在使用原型字段之一上的 chrome 'inspect element' 查看源代码时,我注意到它显示表单关闭标记过早呈现(尽管使用查看源代码时看起来很好)。我使用的是 form_start 和 form_end,但它们位于不同的 div 中(twitter bootstrap “rows”)。似乎表单结束标记在包含 form_start 的 div 的结束标记之前自动呈现。我移动了 form_start 和 form_end,使它们成为我视图中最外层的元素(将它们放在同一个“容器”div 中),现在一切正常。重量级

截图视觉助手:http: //imgur.com/hrgOV9T

于 2013-09-25T15:24:47.033 回答