首先,让我承认我是符号形式的业余爱好者。如有任何帮助,我们将不胜感激。我不被允许共享实际的代码,因此我使用一些示例代码来演示用例。
下面给出的是用例,
我有一个实体叫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:注意你的类的命名约定