问题 如何在symfony2中嵌入预先载入的非实体表单集合


我想嵌入一个预先充电的非实体表单集合,这里是代码,首先是父表单buildForm方法。

public function buildForm(FormBuilderInterface $builder, array $options) {
    $builder->add("example1")->add("example2");
    $builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
        /*some logic to do before adding the collection of forms*/
        $form->add('aclAccess', 'collection', array(
            'type' => new ChildFormType(),
            'allow_add' => true,
            'mapped' => false,
            'data' => /* I dont know how to precharge a collection of non-entity forms*/
        ));
    });
}

现在的孩子形式

public function buildForm (FormBuilderInterface $builder, array $options) {
    $builder->add("test1", "text", array("read_only" => true, "data" => "test"));
    $builder->->add("test2", "choice", array(
        'choices'   => array('opt1' => 'Opt1', 'opt2' => 'Opt2'),
        'multiple'  => true,
        'expanded'  => true
    ));
}

所以基本上我想在test2字段中管理那些子选项作为单独的表单,每个选项组将取决于test1字段的值,我知道这可以通过在没有表单类的twig编码everythin来完成,但我认为有表单类它是运行phpunit测试,可维护性等的最佳实践...


5827
2017-11-01 15:37


起源



答案:


根据文档 使用没有类的表单,绑定数据只是一个数组。

如果你  执行其中任何一项,然后表单将返回数据   作为一个数组。在这个例子中,因为 $defaultData 不是一个对象   (和不 data_class 选项已设置), $form->getData() 最终   返回一个数组。

并澄清您可能对表单数据的任何误解 - 表单类型的基础对象/类 不一定是实体  - 您可以使用任何具有公共属性的类或者映射到表单域的getter / setter。就此而言,实体类本身并不特别 - 它们只有一堆映射信息告诉ORM如何持久化它们。

但是,回到你原来的问题,我不知道你的ChildFormType是什么样的,但我们假设它有两个字段, sequence 和 title

    $form->add('aclAccess', 'collection', array(
        'type' => new ChildFormType(),
        'allow_add' => true,
        'mapped' => false,
        'data' => array(
            array('sequence' => 1, 'title' => 'Foo')
          , array('sequence' => 2, 'title' => 'Bar')
        )
    ));

应该 做的伎俩


13
2017-11-01 16:47