3

編集

SOに関する多くの質問は、Ajax(これは非常に人気があります)を介したフォーム送信に関するものですが、ajax呼び出しを介したフォームの表示方法に関するものではありません。

私の質問は太字の部分についてです:ユーザーがフォームを要求します-> ajaxCall->displayForm- >ユーザーがフォームを送信します->フォームをコントローラーに送信します->フォームを検証します->ユーザーに応答を送信します(エラーかどうか)。


質問

POSTであるajax呼び出しは、ajax呼び出しを行うときに$request->isMethod('POST')常に戻りますtrue。したがって、ajax呼び出しを介して新しいフォームが要求されている場合、そのフォームは常に検証されます。以下のコードを同封しました。フォームは正常に表示されますが、次のエラーメッセージがフォームに表示されます。

CSRFトークンが無効です。

問題は、コントローラーでのフォームのajax呼び出し要求中にフォームが検証されていることです。

ちなみに、フォームの送信はうまく機能し、検証もうまく機能します。

空白の新しいフォームを検証せずにAjaxを介してフォームを表示する方法を知っている人はいますか?

これまでの私のコード:

/**
 * Display the message as well as the form to reply to that message
 *
 * @param Request $request
 * @return Response
 */
public function viewMessageAction(Request $request)
{
    //Forbid every request but jQuery's XHR
    if (!$request->isXmlHttpRequest()){
        return new Response('', 200, array('Content-Type' => 'application/json'));
    }

    //Retrieve the message from the request
    $messageId = $request->request->get('messageId');
    $message = $this->getMessageManager->getMessage($messageId);

    //Creates the form to reply to the message
    $form = $this->container->get('reply_form.factory')->create($message);

    if ($request->isMethod('POST')) {
        $form->bind($request);

        if ($form->isValid()) {
            //...
            return $this->redirect($this->generateUrl('task_success'));
        }
    }

    $answer =$this->container->get('templating')->renderResponse('AcmeMessageBundle:Message:message.html.twig', array(
        'form' => $form->createView(),
        'message' => $message
    ));

    $response = new Response();
    $response->headers->set('Content-type', 'application/json; charset=utf-8');
    $response->setContent(json_encode($answer));
    return $response;

}

編集:jQueryの部分:

<script type="text/javascript">
    $(function(){

        var myPath = ;//...

        function getMessage(messageId){
            $.ajax({
                type: "POST",
                url:  myPath,
                data: "messageId="+messageId,
                success: function(returnData){
                    $('#message').html(returnData);
                }
            });
        }

    });
</script>
4

2 に答える 2

2

ajax呼び出しは必ずしもPOSTである必要はありません。GET、PUT、またはDELETEの場合があります。したがって、フォームを取得するためにajax呼び出しを行う場合は、それをGETリクエストにします。

jqueryを使用している場合は、次のようにします

$.ajax({
   url: "http://localhost/proj/url",
   type:'GET'
})

Using XHRを使用している場合は、open関数でタイプを指定できます

xhr.open( 'GET', URL)

PS:json_encodeの代わりにJMSシリアライザーサービスをシリアル化に使用することをお勧めします

于 2013-03-12T05:02:57.550 に答える
0

また、 FOSJsRoutingBundleに興味があるかもしれません。これは、一般的にajaxおよびSymfony2ルートでの作業に多くの快適さを追加するためです。

于 2013-03-12T12:54:01.663 に答える