Symfony построитель форм: Как перебирать / отображать динамически c количество текстовых полей в ветке? (Sylius - дополнительный этап оформления заказа) - PullRequest
0 голосов
/ 05 февраля 2020

Я добавил дополнительный шаг проверки к процедуре проверки Sylius, и я пытаюсь добавить 1 текстовое поле на экземпляр заказанного элемента. Таким образом, поместив 3x itemA и 1x itemB в корзину, должно появиться 4 текстовых поля.

У меня есть этот код в конструкторе форм (на основе кода здесь: https://sf.khepin.com/2011/08/basic-usage-of-the-symfony2-collectiontype-form-field/)

        $builder->add('myCollection', CollectionType::class, $formOptions);

        $totalCounter = 0;
        /** @var OrderItem $item */
        foreach($order->getItems() as $item) {
            for($itemCounter = 0 ; $itemCounter < $item->getQuantity(); $itemCounter++ ) {
                $totalCounter++;
                $builder->get('myCollection')->add('item_' . $totalCounter, TextType::class, $formOptions);
            }
        }

Первый вопрос: Правильный ли это подход для конструктора форм для моего конкретного сценария, и во-вторых: если да, как мне прочитать из этого в шаблоне ветки?

form.children.myCollection существует, но, похоже, не содержит этих потомков, так что я мог бы использовать их с функцией form_row. То, что я ожидал бы, примерно так:

{% set totalCounter = 0 %}
{% for item in order.items %}
    {% for itemCounter in 1..item.quantity %}
        {% set totalCounter = totalCounter + 1 %}
        {{  form_row(form.children.myCollection['item_' ~ totalCounter ]) }}
    {% endfor %}
{% endfor %}

Есть идеи, как это сделать? Спасибо за любую подсказку заранее!

1 Ответ

0 голосов
/ 14 февраля 2020

Только что увидел, мой точный случай описан в начале документации CollectionType https://symfony.com/doc/current/reference/forms/types/collection.html

Часть конструктора форм ..

$builder->add('emails', CollectionType::class, [
    // each entry in the array will be an "email" field
    'entry_type' => EmailType::class,
    // these options are passed to each "email" type
    'entry_options' => [
        'attr' => ['class' => 'email-box'],
    ],
]);

.. и часть ветки:

{{ form_label(form.emails) }}
{{ form_errors(form.emails) }}

<ul>
{% for emailField in form.emails %}
    <li>
        {{ form_errors(emailField) }}
        {{ form_widget(emailField) }}
    </li>
{% endfor %}

...