12

我想嵌入一个预充电的非实体表单的集合,这里是代码,首先是父表单的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 中编码所有内容来完成,但我认为有表单类它是运行 phpunit 测试、可维护性等的最佳实践......

4

1 回答 1

15

根据Using a Form without a Class的文档,绑定的数据只是一个数组。

如果您执行上述任何一项操作,则表单会将数据作为数组返回。在这个例子中,因为$defaultDatais 不是一个对象(并且没有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')
        )
    ));

应该可以解决问题

于 2013-11-01T16:47:30.980 回答