Создайте пользовательский тип поля, имеющий CollectionType в качестве родительского

#php #forms #symfony #collections

#php #формы #symfony #Коллекции

Вопрос:

У меня есть SmsType , EmailType и VoiceCallType все они содержат следующую коллекцию:

             ->add('answers', CollectionType::class, [
                'label'         => 'form.communication.fields.answers',
                'entry_type'    => AnswerType::class,
                'entry_options' => [
                    'label' => false,
                ],
                'allow_add'     => true,
                'allow_delete'  => true,
                'delete_empty'  => true,
                'prototype'     => true,
                'required'      => false,
                'attr'          => [
                    'class' => 'collection',
                ],
            ])
  

Для упрощения я создал AnswersType поле, имеющее CollectionType родительский тип:

 <?php

namespace AppFormType;

use SymfonyComponentFormAbstractType;
use SymfonyComponentFormExtensionCoreTypeCollectionType;
use SymfonyComponentOptionsResolverOptionsResolver;

class AnswersType extends AbstractType
{
    public function setDefaultOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'label'         => 'form.communication.fields.answers',
            'entry_type'    => AnswerType::class,
            'entry_options' => [
                'label' => false,
            ],
            'allow_add'     => true,
            'allow_delete'  => true,
            'delete_empty'  => true,
            'prototype'     => true,
            'required'      => false,
            'attr'          => [
                'class' => 'collection',
            ],
        ]);
    }

    public function getParent()
    {
        return CollectionType::class;
    }
}
  

И используйте ->add('answers', AnswersType::class) для всех типов форм вместо большого блока.


По какой-то причине результирующая разметка не совпадает:

Без AnswersType , form_row() генерирует следующую разметку:

<fieldset class="form-group"><div id="campaign_trigger_answers" class="collection" data-prototype=" amp;<div class=amp;quot;row answer-rowamp;quot; style=amp;quot;margin-bottom: 5px;amp;quot; id=amp;quot;answer-nb-__name__amp;quot;amp;> amp;<div class=amp;quot;col-10amp;quot;amp;> amp;<input type=amp;quot;textamp;quot; id=amp;quot;campaign_trigger_answers___name__amp;quot; name=amp;quot;campaign[trigger][answers][__name__]amp;quot; placeholder=amp;quot;Saisir une réponseamp;quot; class=amp;quot;answer-input form-controlamp;quot; /amp;> amp;</divamp;> amp;<div class=amp;quot;col-2 text-rightamp;quot;amp;> amp;<a href=amp;quot;#amp;quot; data-index=amp;quot;__name__amp;quot; class=amp;quot;remove-answer btn btn-dangeramp;quot;amp;>Xamp;</aamp;> amp;</divamp;> amp;</divamp;> "></div></fieldset>

С AnswerType помощью , form_row() генерирует следующую разметку:

<fieldset class="form-group"><div id="campaign_trigger_answers"></div></fieldset>

Как вы можете видеть, prototype атрибут AnswersType больше не генерируется, хотя я установил для параметра значение true . В чем моя ошибка?