首页 文章

Symfony表单事件:ChoiceType字段意外返回null

提问于
浏览
1

我正在使用symfony表单,我在字段中使用select2作为ajax请求,我听 PRE_SUBMIT 事件获取选项列表并给出 choices 选项

$opts = $config->getOptions();
$opts['choices'] = $listImages; //array of Image object

但是在var_dump中的 PRE_SUBMIT 事件中,我在表单中获取所选值,并在闭包中使用它,并且当持久化时该字段具有空值,所以我在 POST_SUBMIT 事件中执行var_dump该字段实际上为null作为值 . 我不明白我错过了什么

My FormType below:

class ArticleType extends AbstractType
{
    /**
     * {@inheritdoc}
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('image', ChoiceType::class, array(
            'expanded' => false,
            'multiple' => false))
        //other field
        ;

       $formModifier = function (FormInterface $form, $image) use ($options) {
        $listImages = $options['em']->getRepository('AlmotivAppBundle:Image')->findBy(array(
            'id' => $image
        ));

        if (!$listImages) {
            $form->add('image')->addError(new FormError(
                'Nous n\'avons pas p trouver l\'image, veuiller choisir une autre'
            ));
        }
        //die(var_dump($listImages)); //array of Image object


        $config = $form->get('image')->getConfig();
        $opts = $config->getOptions();
        $opts['choices'] = $listImages;
        $typeName = get_class($config->getType()->getInnerType());
        $form->add('image', $typeName, $opts);
        //die(var_dump($form->get('image')->getConfig()->getData())); //return null
    };

    $builder->get('image')->addEventListener(
        FormEvents::PRE_SUBMIT,
        function (FormEvent $event) use ($formModifier) {
            $image = $event->getData();
            //die(var_dump($image)); //return 10
            $formModifier($event->getForm()->getParent(), $image);
        }
    );

我正在使用框架的v3.1 . 如果您需要更多,请询问 .

1 回答

  • 1

    这似乎是在那个时间点返回的完全有效的值 .

    PRE_SUBMIT 期间,您获得父表单并将其传递给 $formModifier ,这没关系 . 但是,该修饰符执行以下操作:

    $typeName = get_class($config->getType()->getInnerType());
    $form->add('image', $typeName, $opts);
    

    碰巧您已经在表单中有一个名为 image 的字段,但重新添加它会完全覆盖其上下文(包括数据) . 在你看一下 Form.php ,你会看到:

    Form.php第873行

    $this->children[$child->getName()] = $child;
    

    也就是说,一旦与表单字段重叠,就无法检索数据 .

    重新添加字段后,为什么需要检索数据?

相关问题