2013-01-10 25 views
3

我需要在一个页面上有两种不同的形式(但使用相同的实体)。要做到这一点,我用createNamedBuilder()如何使用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(); 

使用谢胜利形式导致“这种形式不应包含额外的领域。”注意。

+0

被废弃什么是每种形式的目的? – Squazic

+1

它可以用在很多情况下,特别是当你想省略太多的“点击这里”链接,例如。您可以在一个页面上登录或注册。在这里,我想分别使用图像上传和数据库插入,因此用户会在整个事件进入数据库之前看到图像。 –

+0

对于使用'createFormBuilder',你是否试图在没有数据传递给它时绑定表单?你能发布更多的控制器代码吗? – Squazic

回答

1

根据the 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的第一和第二参数的位置进行交换)

2

在Symfony的2.8/3.0这种情况已经改变了一下,如果你有一个表单,您要绑定其他实体,然后看到我的答案在这里:

Passing data to buildForm() in Symfony 2.8/3.0

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

我也纳入@sarahg有关使用setAllowedTypes()指令和setRequired()选项,它似乎很好地工作,但你首先需要与setDefined()

也可以定义表单内场,如果你需要设置记住数据将其添加到data字段。

在控制器我使用getBlockPrefix作为getName2.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', 
      ) 
     ) 
... 
} 
+1

尽管这可能会回答这个问题,但[这将是更可取的](http://meta.stackoverflow.com/q/8259)在这里包括了答案的基本部分,并提供了供参考的链接。 – IKavanagh

+0

@IKavanagh我在链接下添加了全部答案。但这不是DRY做到这一点,这就是为什么我只发布链接。 – Ethernal