如何在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是一个没有数据类的表单类型,有自己的模板,它将自己使用。我想做的是在testEntityType中重用formType1,因为formType1有映射到testEntity属性的字段,这样当提交时,我可以获得带有表单数据的testEntity对象,也可以在最终表单中获得formType1的视图。

控制器动作有这个,

$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

实际上,您的formType1只是一个自定义类型。因此,你唯一要做的就是导入你想要使用的类型,并将其添加到你的生成器中,就像你对非自定义类型(ChoiceType、TextType等)所做的那样。

use YourBundleTypeformType1;
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:注意你的类的命名约定

最新更新