3

我需要在一页上有两种不同的形式(但使用相同的实体)。为此,我使用了createNamedBuilder()

$cover = $this->get('form.factory')->createNamedBuilder('cover')
    ->add('file')
    ->getForm();

$data = $this->get('form.factory')->createNamedBuilder('data')
    ->add('name','text')
    ->getForm();

我的问题是,如何将我的实体绑定到它?当我使用createFormBuilder()它就像

$game = new Game;
$form = $this->createFormBuilder($game);

如果我尝试这样使用createFormBuilder

    $cover = $this->createFormBuilder($game)
        ->add('file')
        ->getForm();

    $data = $this->createFormBuilder($game)
        ->add('name')
        ->getForm();

使用第二个表单会导致“此表单不应包含额外字段”。注意。

4

2 回答 2

2

在 Symfony 2.8/3.0 中,这发生了一些变化,如果您有一个想要绑定其他实体的表单,那么请在此处查看我的答案:

在 Symfony 2.8/3.0 中将数据传递给 buildForm()

如果有人使用服务中的 a createNamedBuilderorcreateNamed函数,form.factory这里是关于如何使用它设置和保存数据的片段。您不能使用该data字段(保留该字段)并且您必须将传递的数据/实体设置为$options值。

我还合并了有关使用和选项的@sarahg说明,它似乎工作正常,但您首先需要定义字段setAllowedTypes()setRequired()setDefined()

如果您需要设置数据,请记住将其添加到data字段中。

在控制器中,我使用getBlockPrefix的是2.8/3.0getName中已弃用的

控制器

/*
* @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',
            )
        )
...
}
于 2015-12-10T14:36:57.060 回答
1

根据API docs,第三个参数createNamedBuilder可用于传入实体。

您的代码应如下所示:

$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,则交换第一个和第二个参数的位置。)

于 2014-10-09T07:13:49.120 回答