2016-09-28 13 views
0

1つのコントローラで2つのフォームを使用しようとしています。それぞれは異なるエンティティを使用します。 2番目のフォームを使用しようとするたびに、最初のフォームが実行されます。それを正しくするには?Symfony3の1つのコントローラに複数のフォームがあります

$document = new Document(); 

    $form2 = $this->createFormBuilder($document) 
     ->add('file', FileType::class, array('label' => 'Wgraj plik ')) 
     ->add('name', TextType::class, array('label' => 'Nazwa dodawanego pliku')) 
     ->add('toFill', CheckboxType::class, array('label' => 'Do wypełnienia?', 'required' => false)) 
     ->add('save', SubmitType::class, array('label' => 'Dodaj plik')) 
     ->getForm(); 


    if ($form2->handleRequest($request)->isValid() && $form2->isSubmitted()) { 
     $em = $this->getDoctrine()->getManager(); 

     $document->upload(); 
     $document->setFormId($id); 

     $em->persist($document); 
     $em->flush(); 


    } 

    $raportFiles = new RaportFiles(); 

    $formRaportsInput = $this->createFormBuilder($raportFiles) 
     ->add('file', FileType::class, array('label' => 'Wgraj plik ')) 
     ->add('name', TextType::class, array('label' => 'Nazwa dodawanego pliku')) 
     ->add('save', SubmitType::class, array('label' => 'Dodaj plik')) 
     ->getForm(); 


    if ($formRaportsInput->handleRequest($request)->isValid()) { 
     $em = $this->getDoctrine()->getManager(); 

     $raportFiles->upload(); 
     $raportFiles->setFormId($id); 

      $em->persist($raportFiles); 
      $em->flush(); 
    } 

私の代わりに$this->get('form.factory')->createNamedBuilder()を使用してみましたが、私はそれを動作させることはできません。

+0

基本に戻る。あなたのブラウザは一度に1つのフォームしか提出しないので、1つのアクションで2つ以上のフォームを処理しようとすると乱雑になることがあります。あなたの最善の策はおそらく各フォームのための個々のPOSTアクションを作ることです。 – Cerad

+0

@セラード、彼は両方のフォームを一度に提出するのではなく、それらのうちの1つだけを提出することを望んでいます。問題は、彼のコードは、常に最初のフォームが提出されたと考えているということです。 –

+0

@dragoste、まさに。彼のコードには2つの形式を区別するものは何もありません。アクションメソッドを2つの異なるメソッドに設定すると、問題が解決されます。 – Cerad

答えて

2

@Ceradただし、symfonyでこれを行う方法は?

3つのルートを定義することから始めて、1つはGETを使用して両方のフォームを表示します。他の2つはPOSTを使用して個々のフォームを処理します。

http://symfony.com/doc/current/routing/requirements.html#adding-http-method-requirements

forms_show: 
    path:  /forms 
    defaults: { _controller: MyBundle:FormsController:show } 
    methods: [GET] 
form_document_post: 
    path:  /form-document 
    defaults: { _controller: MyBundle:FormsController:documentPost } 
    methods: [POST] 
form_raport__files_post: 
    path:  /form-raport-files 
    defaults: { _controller: MyBundle:FormsController:raportFilesPost } 
    methods: [POST] 

お使いのコントローラが3アクションメソッドを必要とします。いくつかのタイプを保存するためにフォームタイプを作ったと仮定します。

http://symfony.com/doc/current/forms.html#creating-form-classes

class FormsController { 
    public function showAction() { 
     $document = new Document(); 
     $documentForm = $this->createForm(DocumentType::class,$document,array(
      'action' => $this->generateUrl('form_document_post'))); 

     $raportFiles = new RaportFiles(); 
     $raportFilesForm = $this->createForm(RaportFilesType::class,$raportFiles,array(
      'action' => $this->generateUrl('form_raport_files_post'))); 

     // Return the processed template 
    } 
    // Only gets called when the document form is posted 
    public function documentPostAction(Request $request) 
    { 
     $document = new Document(); 
     $documentForm = $this>createForm(DocumentType::class,$document); 
     $documentForm->handleRequest($document); 
     if ($documentForm->isValid()) { 
      // Persist 
      return $this->redirectToRoute('forms_show'); 
     } 
     // You will have to decide how you want to handle form errors 
    } 
    // Repeat for second form 
+0

これは完璧に動作します!ご助力ありがとうございます。 – hamzo

0

具体的な形は、このことにより提出された場合は、確認することができます。

$form2->handleRequest($request);  
if ($form2->isSubmitted() && $form->isValid()){ 
    ... 
} 

$formRaportsInput->handleRequest($request);  
if ($formRaportsInput->isSubmitted() && $formRaportsInput->isValid()){ 
    ... 
} 

これは仕事を行いますが、)

EDIT:そして、これは上にありますもちろん同じコントローラーアクション!

+0

素晴らしいアイデアだが、うまくいかない。それを試してみてください。あなたは要求オブジェクトで直接いくつかのチェックを行うことで動作させることができますが、それは乱雑になるだろうし、ハックのビットです。 – Cerad

+0

あなたの答えをありがとう。残念ながら、それはフォームとの私の戦いの第一歩でした。動いていない。 – hamzo

+0

2つの異なるアクションでフォームを作成し、再グループ化してやり直してください。 –

関連する問題