Symfony2 multiple Объекты одного класса в одной форме (SOLVED)

Я отправил свое решение в качестве ответа.

Я хочу отобразить форму, которая имеет несколько объектов одного класса. Я отображу 2 поля, Price (type = text) и Enabled (type = checkbox).

Я не знаю, сколько у меня будет этих объектов, поэтому форма должна будет получить их динамически.

Я попытался сделать следующее

public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add('price', 'text', array( 'label' => 'Price', 'required' => true )) ->add('enabled','checkbox',array( 'label' => 'Use this currency', )) ; } public function setDefaultOptions(OptionsResolverInterface $resolver) { $resolver->setDefaults(array( 'data_class' => 'Osiris\Entity\Pricing', 'csrf_protection' => false )); } public function getName() { return 'pricingtype'; } 

И в моем контроллере я создал свою форму следующим образом:

 $pricingForm = $this->createFormBuilder($prices) ->add('items','collection',array( 'required' => false, 'prototype' => true, 'type' => new PricingType(), )) ->getForm() ; 

В моей ветке я делаю:

 {% for price in form_pricing %} <h2>Price</h2> <div class="row">{{ form_widget(price) }}</div> {% endfor %} 

Однако он приходит только с ценами h2 и пустой div с классом = row. Я чувствую, что я на полпути, но я понятия не имею, как двигаться дальше. Если кто-то знает, как получить поля на отправке, я буду очень благодарен.

Solutions Collecting From Web of "Symfony2 multiple Объекты одного класса в одной форме (SOLVED)"

Я нашел решение ,

способ создания формы в контроллере был неправильным! Я должен был сделать следующее:

 $pricingForm = $this->createFormBuilder(array('prices'=>$prices)) ->add('prices','collection',array( 'required' => true, 'allow_add' => true, 'type' => new PricingType(), )) ->getForm() ; 

«allow_add => true» необходимо при работе с коллекцией, иначе он НЕ добавит в форму какой-либо из коллекции PricingType.

Затем, поскольку форма встроена в контроллер « $this->createFormBuilder(array('prices'=>$prices)) , массив $prices должен передаваться как массив с именем массива, таким же, как тот, который используется в« ->add('prices','collection',array(...) ", который является 'prices' поэтому Symfony будет знать, что связывать где. $prices – это массив массива объектов ценообразования array(0 => new Pricing()) .

В моем PricingType у меня есть:

 class PricingType extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add('price', 'text', array( 'label' => false, 'required' => true )) ->add('enabled','checkbox',array( 'label' => 'Use this currency', )) ; } public function setDefaultOptions(OptionsResolverInterface $resolver) { $resolver->setDefaults(array( 'data_class' => 'XXX\XXX\Entity\Pricing', 'csrf_protection' => false )); } public function getName() { return 'pricingtype'; } } 

Здесь мне нужно иметь контроль над атрибутом метки. Я не мог найти пути для него (если кто-нибудь знает, пожалуйста, как это сделать). Я переопределяю шаблон моей ветки:

Наверху нам нужна следующая строка кода:

  {% form_theme form_pricing _self %} 

Затем переопределите строку и виджет следующим образом (это был кошмар для отладки):

 {% block _form_prices_entry_row %} {% spaceless %} {{ form_widget(form) }} {% endspaceless %} {% endblock %} {% block _form_prices_entry_widget %} {% spaceless %} {{ form_row(form.price, { 'label' : form.vars.value.getCurrency().getTitle() } ) }} {{ form_row(form.enabled) }} {% endspaceless %} {% endblock %} 

Затем в теле выведите элементы формы следующим образом:

 {% for price in form_pricing.prices %} <div class="price-row">{{ form_row(price) }}</div> {% endfor %} 

Я действительно надеюсь, что это поможет вам. Это был настоящий кошмар, чтобы отлаживать особенно твиг-файл, я сделал это благодаря моему умному коллеге.

Я думаю, что вы пропустили цикл for в своем файле twig. Проверьте этот пример:

  {# store the prototype on the data-prototype attribute #} <ul id="email-fields-list" data-prototype="{{ form_widget(form.emails.vars.prototype)|e }}"> {% for emailField in form.emails %} <li> {{ form_errors(emailField) }} {{ form_widget(emailField) }} </li> {% endfor %} </ul> 

См. Цикл, я думаю, что вам нужно добавить в свой файл twig.

В дополнение к циклам вам также нужно добавить JavaScript .

Проверьте эту ссылку:

http://symfony.com/doc/current/reference/forms/types/collection.html#adding-and-removing-items

Проверьте полный код. Это поможет вам генерировать несколько форм сущностей из одного класса сущности, используя тип поля коллекции.