symfony CollectionType -> как добавить поля в CollectionType вручную без какой-либо сущности?

#php #forms #symfony #twig

#php #формы #symfony #twig

Вопрос:

У меня проблема с отображением формы: я хотел бы определить несколько похожих полей формы (передать их в массиве или создать в цикле), а затем я хотел бы отобразить их в twig в цикле, подобном этому:

 {% for field in form.collection %}
    <li>
        {{ form_label(field) }}
        {{ form_widget(field) }}
    </li>
{% endfor %}
  

Причина: мне нужно иметь доступ к метке и виджету каждого поля при его рендеринге в цикле (не зная имени каждого поля). Мне кажется, что единственный способ — это иметь CollectionType.
Это не основано ни на какой сущности. Я видел документы с примерами с сущностями, но можно ли добавлять поля вручную?

Что-то вроде:

 class FormcollectionType extends AbstractType
{

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
   

        $builder->add('collection', CollectionType::class, [
            // each entry in the array will be an "ChoiceType" field
            'entry_type' => ChoiceType::class,
            // these options are passed to each "collection" type
            'entry_options' => [
                'attr' => ['class' => 'someclass'],
            ],

            // How to define few ChoiceType fields in CollectionType here, manually ?
        ]);
  

Спасибо за любую помощь 🙂

Ответ №1:

Спасибо,

на самом деле, в чем хитрость, так это в поле «данные»….

итак:

          $builder->add('collection', CollectionType::class, [
            'entry_type'   => ChoiceType::class,
            'entry_options' => [
                'attr' => ['class' => 'someclass'],
                'choices'  => [
                    'Nashville' => 'nashville',
                    'Paris'     => 'paris',
                    'Berlin'    => 'berlin',
                    'London'    => 'london',
                ],
            ],
            'data' => ['choice1Field'  => 'choice1', 
                      'choice2Field'  => 'choice2'  ]
                
            ]);
  

Комментарии:

1. Таким образом, я могу добавить много типов выбора, передав массив в ‘data’, но есть ли аналогичный способ, если я хочу добавить несколько пар, скажем [ChoiceType, SubmitType]?