Php 如何使用createNamedBuilder()绑定实体?
我需要在一个页面上有两个不同的表单(但使用相同的实体)。为此,我使用了Php 如何使用createNamedBuilder()绑定实体?,php,symfony,Php,Symfony,我需要在一个页面上有两个不同的表单(但使用相同的实体)。为此,我使用了createNamedBuilder(): 我的问题是,如何将我的实体绑定到它?当我使用createFormBuilder()时 $game = new Game; $form = $this->createFormBuilder($game); 如果我尝试像这样使用createFormBuilder: $cover = $this->createFormBuilder($game) -&
createNamedBuilder()
:
我的问题是,如何将我的实体绑定到它?当我使用createFormBuilder()
时
$game = new Game;
$form = $this->createFormBuilder($game);
如果我尝试像这样使用createFormBuilder
:
$cover = $this->createFormBuilder($game)
->add('file')
->getForm();
$data = $this->createFormBuilder($game)
->add('name')
->getForm();
$game = new Game;
$cover = $this->get('form.factory')->createNamedBuilder('cover', 'form', $game)
->add('file')
->getForm();
$data = $this->get('form.factory')->createNamedBuilder('data', 'form', $game)
->add('name','text')
->getForm();
使用secound表单会导致“此表单不应包含额外字段”。注意。根据,可以使用createNamedBuilder
的第三个参数传入实体
您的代码应该如下所示:
$cover = $this->createFormBuilder($game)
->add('file')
->getForm();
$data = $this->createFormBuilder($game)
->add('name')
->getForm();
$game = new Game;
$cover = $this->get('form.factory')->createNamedBuilder('cover', 'form', $game)
->add('file')
->getForm();
$data = $this->get('form.factory')->createNamedBuilder('data', 'form', $game)
->add('name','text')
->getForm();
(请注意,如果您碰巧仍在使用Symfony 2.0,则第一个和第二个参数的位置将被交换。)在Symfony 2.8/3.0中,这一点发生了一些变化,如果您有一个表单希望绑定其他实体,请在此处查看我的答案: 如果有人正在使用
form.factory
服务中的createNamedBuilder
或createNamedBuilder
函数,下面是有关如何使用它设置和保存数据的代码段。您不能使用数据
字段(保留该空值),必须将传递的数据/实体设置为$options
值
我还加入了@sarahg关于使用setAllowedTypes()
和setRequired()
选项的说明,看起来效果不错,但首先需要使用setDefined()定义字段
如果您需要设置数据,请记住将其添加到data
字段中
在控制器中,我正在使用getBlockPrefix
,因为getName
在2.8/3.0
控制器
/*
* @var $builder Symfony\Component\Form\FormBuilderInterface
*/
$formTicket = $this->get('form.factory')->
createNamed(
$tasksPerformedForm->getBlockPrefix(),
TaskAddToTicket::class,
null,
array(
'ticket' => $ticket
)
);
表格
public function configureOptions(OptionsResolver $resolver) {
$resolver->setDefined('ticket');
$resolver->setRequired('ticket');
$resolver->addAllowedTypes('ticket', Ticket::class);
$resolver->setDefaults(array(
'translation_domain'=>'AcmeForm',
'validation_groups'=>array('validation_group_001'),
'tasks' => null,
'ticket' => null,
));
}
public function buildForm(FormBuilderInterface $builder, array $options) {
$this->setTicket($options['ticket']);
//This is required to set data inside the form!
$options['data']['ticket']=$options['ticket'];
$builder
->add('ticket', HiddenType::class, array(
'data_class'=>'acme\TicketBundle\Entity\Ticket',
)
)
...
}
每个表单的用途是什么?它可以在很多情况下使用,特别是当您想要添加太多“单击此处”链接时,例如,您可以在一个页面上登录或注册。在这里,我想分别在数据库中使用图像上传和插入,这样用户就可以在整个事情进入数据库之前看到图像。对于使用createFormBuilder
,您是否尝试在没有数据传递到表单时绑定表单?你能发布更多的控制器代码吗?实际上你试过多步骤表单吗?看来你想干什么就干什么。我很可能得自己做点什么。Squazic的包对我来说现在有点太多了。虽然这可能回答了问题,但在这里包括答案的基本部分,并提供链接供参考。@IKavanagh我在链接下面添加了整个答案。但这并不是干的,这就是为什么我只发布了一个链接。