Я отправил свое решение в качестве ответа.
Я хочу отобразить форму, которая имеет несколько объектов одного класса. Я отображу 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. Я чувствую, что я на полпути, но я понятия не имею, как двигаться дальше. Если кто-то знает, как получить поля на отправке, я буду очень благодарен.
Я нашел решение ,
способ создания формы в контроллере был неправильным! Я должен был сделать следующее:
$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
Проверьте полный код. Это поможет вам генерировать несколько форм сущностей из одного класса сущности, используя тип поля коллекции.