Symfony 4表单-如何在子表单中获取父元素的子元素

问题描述 投票:0回答:1

我正在尝试根据地区以及一个人的出生日期列出城市。这就是为什么在我的代码中我尝试这样做的原因:

 $builder->get('region')->addEventListener(
            FormEvents::POST_SUBMIT,
            function (FormEvent $event) use ($formModifier) {
                $data = $event->getForm()->getData();

                $birthDate = $event->getForm()->getParent()->getData();

                //formModifier where I am adding the $form->add('city'...
                $formModifier($event->getForm()->getParent(), $data, $birthDate);
            }
        );

但是我从$ event-> getForm()-> getParent()-> getData()获得的数据不呈现我想要的数据,它获取的是预设数据的值,而不是所提交的数据。

当我转储$ event-> getForm()-> getParent()时,我可以看到要定位的数据位于子对象中,并且当我添加getData()时,该数据当前正在发送给我在模型数据中。

Symfony\Component\Form\Form {#2290 ▼
  -config: Symfony\Component\Form\FormBuilder {#2330 ▶}
  -parent: null
  -children: Symfony\Component\Form\Util\OrderedHashMap {#2329 ▶}
  -errors: []
  -submitted: false
  -clickedButton: null
  -modelData: array:2 [▶]
  -normData: array:2 [▶]
  -viewData: array:2 [▶]
  -extraData: []
  -transformationFailure: null
  -defaultDataSet: true
  -lockSetData: false
  -name: "information_salarie"
  -inheritData: false
  -propertyPath: null
}

我尝试使用getChildren(),但它说不知道该方法。如何访问children元素中的数据?

出生日期在日期时间输入中,恰好在区域1之前。我需要它,以便我可以获取该人出生时所在城市的名称(如果该名称与当前名称不同)。

非常感谢您的帮助!

forms symfony4 addeventlistener
1个回答
0
投票

您无法从子事件侦听器访问父数据:表单提交是在根表单上启动的,该根表单随后在触发submit事件后立即在所有子表单上调用PRE_SUBMIT方法。

如果要基于父数据修改子表单,则只能在父表单上使用PRE_SUBMIT事件。

Ex:

$builder->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $e) {
    $data = $e->getData();
    $form = $e->getForm();

    if ($data['birth_date'] === '1900-05-01') {
        $form->add('city', CityType::class);
    }
});

请注意,如果必须更改已经添加的字段的类型/选项,则必须先将其删除。

© www.soinside.com 2019 - 2024. All rights reserved.