2012-01-25 23 views
15

私はJQuery AJAX呼び出しを通じてコメントを保存するコメントボックスを開発しています。CSRFがJQuery AJAXを通過するSymfony2フォーム

はJQuery

ここではそのためのjQueryのコード(これはシームレスに動作)は次のとおり

$(".post-comment").click(function() { 
    var $form = $(this).closest("form"); 

    if($form) 
    { 
     $.ajax({ 
      type: "POST", 
      url: Routing.generate('discussion_create'), 
      data: $form.serialize(), 
      cache: false, 
      success: function(html){ 
       alert("Success!"); 
       // Output something     
      } 
     }); 
    } 
    else 
    { 
     alert("An error occured"); 
    } 
    return false; 
}); 

Symfony2のコントローラ

Symfony2の制御方法は、フォームのデータとプロセスをピックアップそれ。そのプロセスの一環として、フォームが有効かどうかを確認します。

$entry = new Discussion(); 
$discussionForm = $this->createForm(new DiscussionType(), $entry); 

if ($request->getMethod() == 'POST') { 

    $discussionForm->bindRequest($request); 

    if ($discussionForm->isValid()) { 

このチェックは真ではありません。

Array 
(
    [0] => The CSRF token is invalid. Please try to resubmit the form 
) 

CSRFトークンがちょうどフォームが同期提出された場合、それは同じようにポストを経由して渡されている。他には、私はエラーメッセージが与えられ、取得されているものを抽出します。

別の可能性のある問題..私は使用していますユニークなフォームIDが

フォームはフォーム型クラスによって作成されます。任意のページにいくつかのコメントフォームがあります。 Symfony2のフォームID属性を移入するための型クラスののgetName()メソッドを使用するように、私はのようにそれを変更した:これは、例えば同じIDなしで複数のコメントフォームを可能

public function getName() 
{ 
    return 'discussionForm' . $randomNumber; 
} 

DiscussionForm20、discussionForm21、discussionForm22など

標準のPHPロジックを使用して、symfony2フォームコンポーネントをミックスから削除し、フォームを生成/処理することができましたが、今はそれに抵抗しています。

フォームCSRFトークンが無効な理由は誰にも分かりますか?どのようにこれを修正することができるか、それをどうやって行うかに関する提案はありますか?

答えて

28

適切なJQuery関数を試してみてください:submit()^^私のソリューションでは、あなたのフォームにid "comment_form"があると思います。すべてのsf2プロジェクトで動作します。

$('#comment_form').submit(function(e) { 

    var url = $(this).attr("action"); 

    $.ajax({ 
     type: "POST", 
     url: url, // Or your url generator like Routing.generate('discussion_create') 
     data: $(this).serialize(), 
     dataType: "html", 
     success: function(msg){ 

      alert("Success!"); 

     } 
    }); 

    return false; 

}); 

通常CSRFフィールドが送信されます。

あなたのフォームテンプレートに{{form_rest(form)}}というタグを追加することを忘れないでください。そうすれば、CSRFのような隠しフィールドがすべて生成されます。

+1

ここでは、JQueryの送信メソッドは重要ではありません。それを動作させるのは、$ .ajax呼び出しが、dataパラメータでシリアル化されたすべてのフォームデータを受け取るということです。 –