У меня есть 2 объектов ...Symfony2 встроенная форма сбора динамически создавать новые объекты
Контракт (идентификатор, CLIENTNAME, contractCities)
ContractCity (номер, имя)
Договора имеет oneToMany отношения с ContractCities
oneToMany:
contractCities:
targetEntity: ContractCity
mappedBy: contract
cascade: [persist, remove]
ContractCities ManyToOne ассоциации с Договором
manyToOne:
contract:
targetEntity: Contract
inversedBy: contractCities
joinColumn:
name: contract_id
referencedColumnName: id
При редактировании/создании договора, я хотел бы иметь возможность динамически добавлять новые города (за Minimun требование 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)));
}
Когда я нажимаю ссылку «Новый город», которая отображается в нижней части списка, я получаю новое поле формы и могу ввести название города. Однако на подачу ничего не происходит. Я могу редактировать существующие города, и изменения сохраняются, но любые новые города, которые я добавил, исчезают.
Мое понимание заключается в том, что Контракт -> AddCity или -> AddContractCity или что-то в этом роде должен быть вызван, но это, похоже, не происходит. Любая идея, что я делаю неправильно?
UPDATE: Когда я отправить форму, я не вижу дополнительные города, показывая в данных POST, во главе с Google ...
Solved: При просмотре исходного кода, используя хром «проверять элемент» в одном из полей прототипа, я заметил, что он показал, что закрывающий тег форм был досрочно отображен (хотя при использовании источника просмотра он выглядел отлично). Я использовал form_start и form_end, но они были в разных div (twitter bootstrap "rows"). Казалось, что тег закрывания формы автоматически отображается непосредственно перед закрывающим тегом div, в котором содержится form_start. Я переместил form_start и form_end так, чтобы они были внешними элементами моего представления (помещая их в один и тот же «контейнер» div), и теперь все работает нормально. Wtf.
Скриншот визуальный помощник: http://imgur.com/hrgOV9T