如何在symfony中使用多个表单类型来创建具有数据类的单个表单

时间:2017-10-20 09:51:53

标签: php symfony

首先,我承认我是symfony形式的业余爱好者。任何帮助将非常感激。我不被允许共享实际代码,因此我使用一些示例代码来演示用例。

以下是用例,

我有一个名为testEntity的实体,

class testEntity {
    private $property1;
    private $property2;
    private $property3;

    //with setters and getters
}

我有一个名为formType1的表单类型,

    class formType1 extends AbstractType {
        public function buildForm(FormBuilderInterface $builder, array $options) {
            $builder
                ->add('property2')
                ->add('property3)
            ;
        }

        public function buildView() {
           // Code that create view vars
        }
    }

我有一个testEntity的表单类型,

class testEntityType extends AbstractType {
    public function buildForm(FormBuilderInterface $builder, array $options) {
        $builder->add('property1)
        ....
    }

    public function configureOptions(OptionsResolver $resolver) {
        $resolver->setDefaults([
            'data_class' => testEntity::class
        ]);
    }
}

formType1是一种表单类型,具有out数据类并且具有自己的模板,并且将单独使用。我想要做的是在testEntityType中重复使用formType1,因为formType1具有映射到testEntity属性的字段,这样在提交时我可以获得带有表单数据的testEntity对象,我也可以获得formType1' s以我的最终形式查看。

控制器动作有这个,

$testEntity = new testEntity();
$form = $this->createForm(PostType::class, $testEntity);

这样当表单提交时,我会使用表单

中的数据获取$ testEntity

如果我没有足够好地理解这个问题,那么请提前道歉。

通过执行此操作,

class testEntityType extends AbstractType {
    public function buildForm(FormBuilderInterface $builder, array $options) {
        $builder->add('property1')
            ->add('formType1', formType1::class, [
                 'mapped' => false,
                 'data' => $options['data']
            ])
        ....
    }

    public function configureOptions(OptionsResolver $resolver) {
        $resolver->setDefaults([
            'data_class' => testEntity::class
        ]);
    }
}

通过选项传递数据并将mapped设置为false

1 个答案:

答案 0 :(得分:0)

事实上,您的formType1只是一种自定义类型。 因此,您唯一需要做的就是导入您想要使用的类型,并将其添加到您的构建器中,就像您使用非自定义类型(ChoiceType,TextType等)一样。

use YourBundle\Type\formType1;

class testEntityType extends AbstractType {
    public function buildForm(FormBuilderInterface $builder, array $options) {
        $builder->add('property1')
            ->add('formType1', formType1::class, [
               'data_class' => testEntity::class, //line edited
            ])
        ....
    }

    public function configureOptions(OptionsResolver $resolver) {
        $resolver->setDefaults([
            'data_class' => testEntity::class
        ]);
    }
}

PS:注意你的课程的命名惯例