【问题标题】:Use two listeners of FormEvents::POST_SUBMIT使用 FormEvents::POST_SUBMIT 的两个监听器
【发布时间】:2021-05-14 07:43:17
【问题描述】:

我想根据提交的数据修改一些表单字段,所以在表单类中我做了:

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('year', ChoiceType::class, [
                'choices' => ['Year' => '-1'] + array_combine(range(date('Y'), date('Y') - 19), range(date('Y'), date('Y') - 19)),
                'label' => false,
            ])
            ->add('make', ChoiceType::class, ['choices' => ['Make' => '-1'], 'label' => false])
            ->add('model', ChoiceType::class, ['choices' => ['Model' => '-1'], 'label' => false]);

        //...

        $builder->get('year')->addEventListener(
            FormEvents::POST_SUBMIT,
            function (FormEvent $event) {
                $year = $event->getForm()->getData();
                $makes = $year === '-1' ? ['Make' => '-1'] : $this->customService->getMakes();
                $event->getForm()->getParent()
                    ->add('make', ChoiceType::class, ['choices' => $makes, 'label' => false]);
            }
        );
        $builder->get('make')->addEventListener(
            FormEvents::POST_SUBMIT,
            function (FormEvent $event) {
                $make = $event->getForm()->getData();
                $models = $make === '-1'  ? ['Model' => '-1'] : $this->customService->getModels();
                $event->getForm()->getParent()
                    ->add('model', ChoiceType::class, ['choices' => $models, 'label' => false]);
            }
        );
    }

但是,即使我提交了make 字段,第二个侦听器也永远不会执行,因此我无法修改model 字段。有什么想法吗?

【问题讨论】:

    标签: php symfony symfony-forms


    【解决方案1】:

    问题似乎是当修改year字段事件监听器中的make字段时,则永远不会调用make字段事件监听器。我找到了让它工作的方法:

        private $makes;
        private $models;
    
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            //...
    
            $builder->get('year')->addEventListener(
                FormEvents::POST_SUBMIT,
                function (FormEvent $event) {
                    $year = $event->getForm()->getData();
                    $this->makes = $year === '-1' ? ['Make' => '-1'] : $this->customService->getMakes();
                }
            );
            $builder->get('make')->addEventListener(
                FormEvents::POST_SUBMIT,
                function (FormEvent $event) {
                    $make = $event->getForm()->getData();
                    $this->models = $make === '-1'  ? ['Model' => '-1'] : $this->customService->getModels();
                    $event->getForm()->getParent()
                        ->add('make', ChoiceType::class, ['choices' => $this->makes, 'label' => false, 'data' => $make]);
                }
            );
            // Same with model field
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-25
      • 2017-03-22
      • 2013-01-04
      • 2018-06-22
      相关资源
      最近更新 更多