2016-09-28 2 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 그러나 심포니에서는 어떻게해야합니까?

처음 세 경로를 정의하여 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

두 가지 다른 동작으로 양식을 만들고 재편성하고 다시 시도해보십시오. 이는 저에게 효과적 일 수 있습니다. –

관련 문제