【问题标题】:Calling $builder->getData() from within a nested form always returns NULL在嵌套表单中调用 $builder->getData() 总是返回 NULL
【发布时间】:2014-02-18 18:18:39
【问题描述】:

我正在尝试获取以嵌套形式存储的数据,但在调用 $builder->getData() 时,我总是得到 NULL。

有谁知道如何在嵌套表单中获取数据?

这是 ParentFormType.php:

class ParentFormType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('files', 'collection', array(
            'type'          => new FileType(),
            'allow_add'     => true,
            'allow_delete'  => true,
            'prototype'     => true,
            'by_reference'  => false
        );
    }
}

文件类型.php

class FileType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        // Each one of bellow calls returns NULL
        print_r($builder->getData());
        print_r($builder->getForm()->getData());
        die();

        $builder->add('file', 'file', array(
            'required'    => false,
            'file_path'   => 'file',
            'label'       => 'Select a file to be uploaded',
            'constraints' => array(
                new File(array(
                    'maxSize' => '1024k',        
                ))
            ))
        );
    }

    public function setDefaultOptions( \Symfony\Component\OptionsResolver\OptionsResolverInterface $resolver )
    {
        return $resolver->setDefaults( array() );
    }

    public function getName()
    {
        return 'FileType';
    }
}

谢谢!

【问题讨论】:

  • 您要访问哪些数据?
  • 子数据,在这种情况下,它是文件对象的 ArrayCollection。另外我会注意到真正的问题是我无法从我制作的表单文件字段扩展名中访问数据,这对于父表单来说工作正常,但正如上面的示例中发生的那样,我无法访问嵌套表单的数据。

标签: symfony symfony-forms symfony-2.3


【解决方案1】:

您需要使用 FormEvents::POST_SET_DATA 来获取表单对象:

        $builder->addEventListener(FormEvents::POST_SET_DATA, function ($event) {
            $builder = $event->getForm(); // The FormBuilder
            $entity = $event->getData(); // The Form Object
            // Do whatever you want here!
        });

【讨论】:

    【解决方案2】:

    这是一个(非常烦人的..)已知问题:

    https://github.com/symfony/symfony/issues/5694

    因为它适用于简单形式但不适用于复合形式。根据文档(请参阅http://symfony.com/doc/master/form/dynamic_form_modification.html),您必须这样做:

    $builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
            $product = $event->getData();
            $form = $event->getForm();
    
            // check if the Product object is "new"
            // If no data is passed to the form, the data is "null".
            // This should be considered a new "Product"
            if (!$product || null === $product->getId()) {
                $form->add('name', TextType::class);
            }
        });
    

    【讨论】:

      【解决方案3】:

      在绑定数据之前构建表单(即调用AbstractType::buildForm()时绑定的数据不可用)

      如果要根据绑定的数据动态构建表单,则需要使用事件

      http://symfony.com/doc/2.3/cookbook/form/dynamic_form_modification.html

      【讨论】:

      • 嗨,我真正想要的是访问表单扩展中的 FileType.php 数据,但我在尝试从 FileType.php 中访问数据时遇到了确切的问题这个扩展工作正常对于非嵌套表单
      • 另外,为什么在父表单中调用 getData() 不会产生任何问题?在我看来,这似乎是一种不一致的行为。
      • @ThomasDecaux 是的,我知道,但这会返回默认数据,而不是绑定数据,这就是我所说的以及这个提问者需要的。您引用的链接的文档块甚至表明:“返回表单的初始数据。”
      • 呵呵,我虽然 OP 知道在表单构建时还没有数据,他想使用“默认”数据,对不起。
      猜你喜欢
      • 1970-01-01
      • 2020-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多