Как передать данные из родительского formType в дочерний formType - PullRequest
1 голос
/ 17 апреля 2019

У меня есть форма, которая проходит в несколько этапов, в том числе:

Шаг 1: простая форма, основанная на сущности 1, которая записывает первую часть набора данных. Шаг 2: родительская форма (на основе сущности 1 на шаге 1), которая реализует дочернюю форму (на основе сущности 2) => CollectionType. Родительская форма ($ builder) содержит данные из шага 1, но не дочернюю форму.

Моя задача проста: моя дочерняя форма содержит ChoiceType, который должен варьироваться в зависимости от заданного

Моя проблема: передать дочерней форме фрагмент данных, который есть у родительской формы ($ builder-> getData ()), чтобы установить условие опции для моего ChoiceType.

Я искал решения, но не нашел никакого результата. Поэтому я думаю, что моя проблема не в ошибке, а в плохом подходе с моей стороны.

Я проверял:

//PARENT
public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('wans', CollectionType::class,
                [
                    'entry_type' => WanDType::class,
                    'entry_options' => [
                        'label' => false,
                        'data' => $builder->getData() // <- here
                    ],
                ]);
    }

//ENFANT
public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $ma_valeur = $builder->getData()->getValue(); //<- here
        if(in_array($ma_valeur, ['1'])) { //<- here
            $builder->add('profil', ChoiceType::class, [
                'choices' => [
                    [...]
                ],
                'label' => false,
            ]);
        } else { //<- here
            $builder->add('profil', ChoiceType::class, [
                'choices' => [
                    [...]
                ],
                'label' => false,
            ]);
        } //<- here
    }

=> Я получаю сообщение об ошибке, объясняющее, что мой класс data_class не соответствует моей дочерней форме. Фактически, data_class родительской формы заменил данные дочерней формы. Ошибка предлагает дать ему нулевое значение, но это вызывает другие ошибки, и Symfony все меньше и меньше радует (логично, на мой взгляд, это не очень хорошая практика).

=> Я пытался использовать опции $. Symfony не счастлив, потому что он отказывается добавлять записи key => значения, которые он не знает в начале координат.

=> Я думал о том, чтобы сделать свое состояние в родительской форме. Но с течением времени состояние может меняться, поэтому, по моему мнению, создание детской формы по типу условий не является хорошей практикой.

=> Я также думал о создании этого поля непосредственно в представлении. Но это также не оптимально в соответствии с эволюцией.

=> Я проверил несколько вещей, которые здесь бесполезно упоминать, каждый раз получая отрицательный результат.

Я сильно сомневаюсь, что SensioLabs не думал о подобных вещах. Мне, наверное, не нужно быть далеко, если кто-нибудь знает, как объяснить, это было бы замечательно.

Спасибо за вашу помощь:)

=============================================== =====

РЕДАКТИРОВАТЬ тест 1

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

    $builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
        dump($event->getForm()->getParent()->getData());
        die('ok');
    });
    die('ok2');
}

Ответы [ 2 ]

1 голос
/ 18 апреля 2019

Итак. Я не нашел это очень интуитивным. Ничто не объясняет, как нужно воспринимать эту технику в контексте коллекции, когда нужно воздействовать на сущность, содержащуюся в коллекции.

Итак, нас не волнует понятие родительской и дочерней формы. Это только вмешательство в форму, на которую повлияла наша модификация (если это дочерний элемент, он будет в дочернем formType).

В основном это дает:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder->add([....]); // without the fields I want to modulate.

    $builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event){
        $wan = $event->getData();

        if(in_array($wan->getEquipment()->->getValue(),['1'])) {
            $event->getForm()->add('profil', ChoiceType::class, [
                'choices' => [
                    [...]
                ],
                'label' => false,
            ]);
        } else {
            $event->getForm()->add('profil', ChoiceType::class, [
                'choices' => [
                    [...]
                ],
                'label' => false,
            ]);
        }
    });
}
0 голосов
/ 17 апреля 2019

Я думаю, что вы хотите сделать что-то вроде этого: https://symfony.com/doc/current/form/dynamic_form_modification.html

с этим вы сможете изменить свою форму на основе предоставленных данных

...