2016-04-11 7 views
1

私はすべてのページにレンダリングされるフォームをレンダリングするコントローラを持っています。symfonyでフォームを処理できません

問題は、フォームが送信イベントについて気にしないことです。

すべてのページが

{{ render(controller('AppBundle:NewsLetter:formRender')) }} 

これはコントローラである、base.html.twig拡張:

<?php 

namespace AppBundle\Controller; 

use Symfony\Bundle\FrameworkBundle\Controller\Controller; 
use Symfony\Component\HttpFoundation\Request; 

use AppBundle\Entity\Emails; 

use Symfony\Component\Form\Extension\Core\Type\EmailType; 
use Symfony\Component\Form\Extension\Core\Type\SubmitType; 

class NewsLetterController extends Controller 
{ 

    public function formRenderAction(Request $request) 
    { 
     $email = new Emails(); 

     $form = $this->createFormBuilder($email) 
      ->add('email', EmailType::class, array('label' => false, 'attr' => array('placeholder' => 'Your e-mail address'))) 
      ->add('save', SubmitType::class, array('label' => 'SUBMIT!')) 
      ->getForm(); 

     $form->handleRequest($request); 

     if ($form->isSubmitted()) { 

      die(); //breakpoint 

      $em = $this->getDoctrine()->getManager(); 
      $em->persist($email); 
      $em->flush(); 

      $this->addFlash('success', 'Email was successfully saved.'); 
     } 

     return $this->render('newsLetter.html.twig', array('form' => $form->createView())); 
    } 
} 

そして最後にそう

<div class="newsletter"> 
    <p>Nechte si zasílat články e-mailem</p> 
    {{ form_start(form) }} 
    {{ form_widget(form) }} 
    {{ form_end(form) }} 
</div> 

をnewsletter.html.twigをフォームは正しくレンダリングされますが、サブミット後は何も起こりません。

答えて

1

アクションを指定しないでフォームを追加すると、アクションをレンダリングした同じURLにポストバックされます。したがって、複数のページに表示されるフォームを持つ場合、各コントローラ関数はそのフォームを処理できる必要があります。

この機能を持つ基本コントローラーを作成し、他のコントローラーを拡張することもできます。このようにした場合、各アクションメソッドはこの関数を呼び出さなければならず、そのページに複数のフォームがある可能性があるため、フォームの送信を個別に処理する必要があります。
例:$emailAction = $form->get('addEmail')->isClicked(

それとも、単にそのフォームを扱うでしょう専用のルートに、フォームのアクションを設定し、多分選択である、多分隠しフィールドとして渡し(元のURLにリダイレクトできあなたのもの)。
例:

$form = $this->createForm(Foo::class, $task, array(
    'action' => $this->generateUrl('target_route'), 
    'method' => 'POST', 
)); 
関連する問題