2013-01-10 54 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