Javascript Symfony2级联下拉列表值通过ajax更改提交时不接受

Javascript Symfony2级联下拉列表值通过ajax更改提交时不接受,javascript,php,jquery,ajax,symfony,Javascript,Php,Jquery,Ajax,Symfony,我的symfony表单中有两个实体下拉字段。在前端,我根据第一个下拉选择值的值,使用ajax更改了第二个下拉选择的选项列表。在提交表格时,我得到一个错误 This value is not valid. 下面是代码 /** * @ORM\ManyToOne(targetEntity="State") * @ORM\JoinColumn(name="province_id", referencedColumnName="id") */ protected $Province; /**

我的symfony表单中有两个实体下拉字段。在前端,我根据第一个下拉选择值的值,使用ajax更改了第二个下拉选择的选项列表。在提交表格时,我得到一个错误

This value is not valid.
下面是代码

/**
 * @ORM\ManyToOne(targetEntity="State")
 * @ORM\JoinColumn(name="province_id", referencedColumnName="id")
 */
protected $Province;

/**
 * @ORM\ManyToOne(targetEntity="District")
 * @ORM\JoinColumn(name="district_id", referencedColumnName="id")
 */
protected $District;
在形式上,

 ->add('domicileDistrict','entity', [
                'label' => ucwords('District'),
                'class'=>'GeneralBundle\Entity\District',
                'required' => true,
                'mapped' => true,
                'attr' => ['class' => 'form-control'],
                'label_attr' => ['class' => 'control-label'],
            ])
->add('domicileProvince','entity', [
                'label' => ucwords('Province'),
                'class'=>'GeneralBundle\Entity\State',
                'required' => true,
                'attr' => ['class' => 'form-control select2'],
                'label_attr' => ['class' => 'control-label'],
            ])
在前端

 $("#profile_from_type_domicileProvince").change(function() {
                var state = $('option:selected', this).val();
                getDistrictByState(state);
            });

            function getDistrictByState(state){
                var dict = {
                    type: "POST",
                    url: "{{ url('ajax_district_by_stateId') }}?id=" + state,
                    success: function(e) {
                       $("#profile_from_type_domicileDistrict option").remove();
                        $.each(e, function(e, p) {
                            $("#profile_from_type_domicileDistrict").append($("<option />", {
                                value: e,
                                text: p
                            }));
                        });
                    } 
                };
                $.ajax(dict);
            }

我也有同样的问题

我在这里编写了一个包来处理“可扩展”选择类型(也包括实体或文档):

我是如何做到的:

在表单提交过程中,我们可以通过PRE_SUBMIT FormEvent访问提交的实体。 所有提交的实体都已加载并位于$event->getData()中

然后,我们只需将提交的选择作为字段的新“选择”选项

警告: 这样做只会验证提交的实体是否存在! 如果只有一部分实体是可能的选择,则必须添加约束以验证它们


您还可以在PRE_SUBMIT事件中设置选项,具体取决于第一个下拉列表的值(而不是使用所有提交的实体)。

我已经添加了该事件,但在更改省下拉列表时不会发生任何更改。请立即查看更新的问题。此事件仅在您提交表单时触发。请编写一些退出(dump('foo');在您的preSubmitData方法中,以了解它是否被触发。
PRE_SUBMIT
不会按照您的要求更改第一个选择框。提交表单时,它会将所需选项填充到动态选择框中。您是否仍然收到
此值无效。
提交时出错?@Jeet是的,我收到了错误,因此在预提交事件中,我收到了所选的下拉值并将其转换为对象,并设置表单字段数据属性。现在它没有提示任何erorr。
$builder->addEventListener(FormEvents::PRE_SUBMIT, [$this, 'preSubmitData']);

  public function preSubmitData(FormEvent $event){
        $form = $event->getForm();
        $data = $event->getData();

        if (array_key_exists('Province', $data)) {
            $state = $data['Province'];
            $event->getForm()
                ->add('District','entity', [
                    'label' => ucwords('District'),
                    'class'=>'GeneralBundle\Entity\District',
                    'required' => true,
                    'mapped' => true,
                    'query_builder' => function(DistrictRepository $repository) use ($state) {
                        $qb = $repository->createQueryBuilder('d')
                            ->andWhere('d.verified = :verified')
                            ->andWhere('d.active = :active')
                            ->setParameter('verified', true)
                            ->setParameter('active', true);

                        if ($state instanceof State) {
                            $qb = $qb->where('d.state = :state')
                                ->setParameter('state', $state);
                        } elseif (is_numeric($state)) {
                            $qb = $qb->where('d.state = :state')
                                ->setParameter('state', $state);
                        } else {
                            $qb = $qb->where('d.state = 1');
                        }

                        return $qb;
                    },
                    'attr' => ['class' => 'form-control select2'],
                    'label_attr' => ['class' => 'control-label'],
                ]);

        }
    }