动态更改sonata_type_model字段

时间:2016-12-24 08:16:16

标签: symfony sonata-admin

我使用Sonata管理包并在页面上的某个字段输入sonata_type_model。

如何动态更改此字段中的元素列表?我需要根据另一个字段中的值更改此字段的内容。

例如,在类型为sonata_type_model的字段中显示了所有类别的东西。在页面上的另一个字段中,我可以选择性别(M或F)。如果选择性别值,我如何自动更改带有类别的字段内容? 在此示例中,对于具有类别应用类型的字段,sonata_type_model非常重要,因为此类型允许选择现有类别并输入新类别。

1 个答案:

答案 0 :(得分:0)

您应该使用表单事件来处理表单的动态生成

Dynamic Generation for Submitted Forms

<强>示例

Admin类中的 configureFormFields

$formBuilder = $formMapper->getFormBuilder();
        $currentUser = $this->getConfigurationPool()->getContainer()->get('security.token_storage');
$formMapper->add('driverCompany',null,array('class' =>'XXXXXBundle:Company'));
                $formModifier = function (FormInterface $form, Company $oCompany = null, $defaultCompany) {
                    $company = null === $oCompany ? $defaultCompany : $oCompany;
                    $form->add(
                        'zones',
                        null,
                        array(
                            'class' => 'XXXXXXBundle:Zone',
                            'label' => 'Zones',
                            'multiple' => true,
                            'required' => false,
                            'placeholder' => '',
                            'query_builder' => function (ZoneRepository $zr) use ($company) {
                                return $zr
                                    ->createQueryBuilder('z')
                                    ->where('z.companyZone = ?1')
                                    ->setParameter(1, $company);
                            },
                        )
                    );
                };
                $formBuilder->addEventListener(
                    FormEvents::PRE_SET_DATA,
                    function (FormEvent $event) use ($formModifier, $defaultCompany) {
                        $data = $event->getData();

                        if ($data !== null) {
                            if ($data->getDriverCompany() === null) {
                                $oCompany = null;
                            } else {
                                $oCompany = $data->getDriverCompany();
                            }
                            $formModifier($event->getForm(), $oCompany, $defaultCompany);
                        }
                    }
                );

                $formBuilder->get('driverCompany')->addEventListener(
                    FormEvents::POST_SUBMIT,
                    function (FormEvent $event) use ($formModifier, $defaultCompany) {

                        $oCompany = $event->getForm()->getData();
                        $formModifier($event->getForm()->getParent(), $oCompany, $defaultCompany);
                    }
                );