2016-09-28 28 views
0

我想在一個控制器中使用兩種形式。他們每個人都使用不同的實體。每次我嘗試使用第二種形式,第一種形式執行。如何使它正確?在Symfony3中的一個控制器中的多個表格

$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

回到基本。您的瀏覽器一次只會提交一份表格,因此嘗試在一個操作中處理兩個或更多表格可能會變得混亂。您最好的選擇可能是針對每個表單進行單獨的POST操作。 – Cerad

+0

@Cerad,他不想一次提交兩份表格,但只能提交其中的一份。問題是他的代碼認爲總是提交第一個表單。 –

+0

@dragoste,的確如此。他的代碼中沒有任何內容來區分這兩種形式。將操作方法​​設置爲兩種不同的方法會使問題消失。 – Cerad

回答

2

@Cerad,但如何在symfony中做到這一點?

首先定義三條路線,一條使用GET來顯示這兩個表單。另外兩個使用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] 

你的控制器需要三個動作的方法。讓我們假設你已經創建了表單類型來保存一些輸入。

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()){ 
    ... 
} 

這將使工作;)

編輯:這是上同樣的控制器動作當然!

+0

好主意,但它不會工作。嘗試一下。您可以通過直接在請求對象中執行一些檢查來使其工作,但會變得雜亂無章,並且有點破解。 – Cerad

+0

感謝您的回答。不幸的是,這是我與表格爭鬥的第一步。它不工作。 – hamzo

+0

這可能是因爲你通過兩種不同的行爲來創建表單,重新組合並重試,這對我很有用。 –

相關問題