Symfony 4 Form Collection с прототипами - PullRequest
0 голосов
/ 12 июня 2018

Я новичок в Symfony 4 и пытаюсь отобразить форму с полем ChoiceType с числовым выбором, чтобы сгенерировать точное количество тегов, выбранных пользователем.

Это мой контроллер:

class ContactController extends AbstractController
{
    /**
     * @Route("/matrix", name="matrix")
     */
    public function index(Request $request)
    {
        $contact = new Contact();
// i've already added some tags
        $tag3 = new Tag();
        $tag3->setName('tag3');
        $contact->getTags()->add($tag3);

        $tag4=new Tag();
        $tag4->setName('ciao');
        $contact->getTags()->add($tag4);

        $form = $this->createForm(ContactType::class, $contact);
        $form->handleRequest($request);


        if ($form->isSubmitted() && $form->isValid()) {

            $contactFormData = $form->getData();
            dump($contactFormData);
        }

        return $this->render('contact/index.html.twig', array(
            //'our_form' => $form,
        'form' => $form->createView(),
        ));
    }

На этом этапе моего кода форма, кажется, заполнена, я проверил с некоторыми дампами.

Этомоя веточка

{% block body %}
    <div>
        {{ form_start(form) }}
        {{ form_widget(form) }}
        <ul class="tags" data-prototype="{{ form_widget(form.tags.vars.prototype)|e('html_attr') }}">
            {% for tag in form.tags %}
                <li> {{ form_row(tag.name) }}
                </li>
            {% endfor %}
        </ul>
    <input type="submit" value="Send" class="btn btn-success" />
    {{ form_end(form) }}
</div>

{% endblock %}

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

class ContactType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('motto')
            ->add('expectations', ChoiceType::class, array(
                'choices'  => array(
                    '1' => '1',
                    '2' => '2',
                    '3' => '3',
                    '4' => '4',
                    '5' => '5',


                ),
            ));

$builder->add('tags', CollectionType::class, array(
    'entry_type' => TagType::class,
    'entry_options' => array('label' => false),
    'allow_add' => true,
    'by_reference' => false,
    'mapped' => false,

));

    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            // Configure your form options here
        ]);
    }
}

1 Ответ

0 голосов
/ 11 мая 2019

Я озадачен этим кодом => $contact->getTags()->add($tag3);.Кажется, Tags является сущностью, а Contact - другой, поэтому ваша Contact сущность должна иметь adders / removers и / или setters / removers (событие, если кумуляция обоих не требуется).

Итак, вашей сущности должно понравиться:

class Contact
{
    // ...

    /** @var Collection */
    protected $tag;

    // ...

    public function __construct()
    {
        $this->tags = new ArrayCollection();
    }

    // ...

    public function addTag(Tag $tag)
    {
        $this->tags->add($tag);
    }

    public function removeTag(Tag $tag)
    {
        // ...
    }
}

Хороший пример реализации вашего случая: Как встроить коллекцию форм

Тогда яне знаю, как выглядит ваша форма TagType, но даже если она хорошо разработана, ваша веточка не в порядке.

Первая form_widget(form) визуализация всей формы

Из Symfony Doc

Визуализирует HTML-виджет данного поля.Если вы примените это ко всей форме или совокупности полей, будет отображена каждая нижележащая строка формы.

Поэтому повторная визуализация коллекции не будет иметь никакого эффекта.И даже если ваш код веточки не подходит для рендеринга коллекции.

...