【问题标题】:How to pass a data from formType parent to formType child如何将数据从表单类型父级传递到表单类型子级
【发布时间】:2019-09-07 10:17:23
【问题描述】:

我有一个分几个阶段发生的表格,包括:

步骤 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已经替换了子窗体的数据。该错误建议给它 null 值,但它会导致其他错误,并且 symfony 越来越不高兴(合乎逻辑,在我看来不是一个好的做法)。

=> 我尝试使用 $options。 Symfony 很不高兴,因为他拒绝添加他在源头不知道的条目 key=>values。

=> 我想过在父表单中创建我的条件。但是条件会随着时间的推移而变化,因此在我看来,按条件类型创建子表单并不是一个好习惯。

=> 我也想过直接在视图中创建这个字段。但根据进化,这也不是最优的。

=> 我测试了几个在这里没用的东西,每次都是阴性结果。

我强烈怀疑 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');
}

【问题讨论】:

    标签: forms symfony conditional-statements entity-relationship


    【解决方案1】:

    我认为您正在寻求做这样的事情可以提供:https://symfony.com/doc/current/form/dynamic_form_modification.html

    这样您就可以根据提供的数据更改您的表单

    【讨论】:

    • 感谢您的建议。我看过这个文档。只有她使用了一个简单的表格。在我之外,我想用父表单包含的内容来影响嵌套的子表单。我不知道如何将这些解决方案应用于我的需求:/
    • 也许是$event-&gt;getForm()-&gt;getParent()-&gt;getData()
    • 我明白了。但是如何将我在 EquipmentDType(父)中构建的 $event 传递给 WanDType(子)?问题还是一样,对吧?
    • 我认为你只需要在 Child 中添加事件,不需要在 Parent 表单类型中使用它
    • 好的。好吧。在我的子表单(WanDType)中,我进行了测试。我把主帖“编辑测试1”。我可能做错了,因为它不起作用。他向我展示了 ok2 而没有向我展示其余部分。
    【解决方案2】:

    所以。我觉得这不是很直观。没有什么可以解释当人们想要影响集合中包含的实体时,必须如何在集合的上下文中理解这种技术。

    所以,我们不关心父子窗体的概念。只是对受我们修改影响的form进行干预(如果是child,就会在formType child中)。

    基本上,这给出了:

    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,
                ]);
            }
        });
    }
    

    【讨论】:

      猜你喜欢
      • 2017-08-23
      • 2021-05-21
      • 1970-01-01
      • 2018-07-14
      • 2021-05-09
      • 2022-12-12
      • 1970-01-01
      • 1970-01-01
      • 2017-08-03
      相关资源
      最近更新 更多