1

Symfony2 プロジェクトにフォームがあり、フォームを送信する必要があります。最初のアイデアは ajax を使用して送信することでしたが、問題は、これが symfony2 に必要な検証に合格せず、CSRF エラー メッセージが表示されることです (前の質問を参照してください: Symfony2: CSRF トークンが無効です。フォームを再送信してください) 。 .

@Elnur の回答に感謝します。$post を使用してフォームを送信できるようになりましたが、別の問題があります。

Ajay を使用すると、html 応答が返され、この応答を HTML 要素に割り当てることができました。

$.ajax({
    type: "POST",
    async: true,
    url: href,
    cache: false,
    dataType: "json",
    success: function(data) {
        $("#content .contentwrap .itemwrap").html( data.content );
    }
});

これが私が得ている応答です:

<div class="item item-last">
<h1>Create Affiliation</h1>
        <div class="error">
        <ul><li>The CSRF token is invalid. Please try to resubmit the form</li></ul>
        <ul><li>The Affiliation should not be blank</li></ul>

    </div>

</div>
<div class="item item-last">
<form action="/app_dev.php/user/submission/affiliation/create/4a0ad9f8020c5cd5712ff4c4c8921b32?ajax=no" method="POST" class="authorForm" >
    <div style="float:left;">
        <table width="100%" cellspacing="0" cellpadding="0">
            <tr>
                <td>
                    <label for="submissionAffiliationForm_affiliation" class=" required">Affiliation</label>
                </td>
                <td>
                    <input type="text" id="submissionAffiliationForm_affiliation" name="submissionAffiliationForm[affiliation]" required="required"    size="40" />
                </td>
            </tr>
            <tr>
                <td>
                    &nbsp;
                </td>
                <td>
                    <div class="button button-left button-cancel">
                        <img src="/bundles/sciforumversion2/images/design/new/button-red.png"/>
                        <a href="/app_dev.php/user/submission/author/edit/4a0ad9f8020c5cd5712ff4c4c8921b32/0" class="submission_link">cancel</a>
                    </div>
                    <div style="float: left;">&nbsp;</div>
                    <div class="button button-left button-cancel">
                        <img src="/bundles/sciforumversion2/images/design/new/button.png"/>
                        <input type="submit" name="login" value="submit" />
                    </div>
                    <div style="clear: both;"></div>
                </td>
            </tr>
        </table>
    </div>

    <input type="hidden" id="submissionAffiliationForm__token" name="submissionAffiliationForm[_token]" value="de9690f61f0ee5f30fdcc5152f44e76787f34bbb" />

</form>
</div>

しかし今、投稿を使用する場合:

$.post($this.attr('action'), $this.serialize(), function (data) {
    $("#content .contentwrap .itemwrap").html( data );
});

HTML が返されなくなりましたが、JSON 形式の応答が返されました。正しい情報を抽出する方法がわかりません。

投稿から得た応答は次のとおりです。

{"responseCode":400,"errors":false,"submitted":false,"content":"<!DOCTYPE html>\n<html>\n    <head>\n        <meta http-equiv=\"Content-Type\" content=\"text\/html; charset=utf-8\" \/>\n        <meta http-equiv=\"refresh\" content=\"1;url=\/app_dev.php\/user\/submission\/4a0ad9f8020c5cd5712ff4c4c8921b32\" \/>\n\n        <title>Redirecting to \/app_dev.php\/user\/submission\/4a0ad9f8020c5cd5712ff4c4c8921b32<\/title>\n    <\/head>\n    <body>\n        Redirecting to <a href=\"\/app_dev.php\/user\/submission\/4a0ad9f8020c5cd5712ff4c4c8921b32\">\/app_dev.php\/user\/submission\/4a0ad9f8020c5cd5712ff4c4c8921b32<\/a>.\n    <\/body>\n<\/html>","notice":""}

コントローラーの外観は次のとおりです。

$em         = $this->getDoctrine()->getEntityManager();
    // get the user object
    $user       = $this->get('security.context')->getToken()->getUser();
    $submission = $em->getRepository('SciForumVersion2Bundle:Submission')->findOneBy( array("hash_key"=>$hash_key) );
    $author     = $em->getRepository('SciForumVersion2Bundle:SubmissionAuthor')->findOneBy( array("id"=>$author_id, "hash_key"=>$hash_key) );
    if( $author == null ) {
        $author = new SubmissionAuthor();
        $author->setPerson( new Person() );
    }

    $enquiry    = new Affiliation();
    $formType   = new SubmissionAffiliationFormType();
    $form       = $this->createForm($formType, $enquiry);

    $request    = $this->getRequest();
    $valid      = true;
    $error      = '';
    if( $request->get('cancel') == 'yes' ) return $this->redirect($this->generateUrl('SciForumVersion2Bundle_user_submission', array("key"=>$submission->getHashKey())));
    if ($request->getMethod() == 'POST' && $request->get('ajax') == 'no') {

        $form->bindRequest($request);

        if ($valid = $form->isValid()) {

            if( $valid ) {

                $em->persist($enquiry);
                $em->flush();

                $uAff = new UserAffiliation();
                $uAff->setUserId( $user->getId() );
                $uAff->setAffiliationId( $enquiry->getId() );
                $uAff->setUser( $user );
                $uAff->setAffiliation( $enquiry );
                $em->persist($uAff);
                $em->flush();

                // Redirect - This is important to prevent users re-posting
                // the form if they refresh the page
                return $this->redirect($this->generateUrl('SciForumVersion2Bundle_user_submission', array("key"=>$submission->getHashKey())));
            }
        }
4

1 に答える 1

3

問題は、まったく新しいHTMLコンテンツを返すことです。
JSが理解し、希望どおりに処理できる情報のみを返す必要があります。

use Symfony\Component\HttpFoundation\Response;

SFのこのクラスを使用すると、プレーンコンテンツを返すことができます。

これを使用する方法があります。

if ($valid) {
    $data = array(
        'success' => true,
        'responseCode' => 307, /* Redirect Temp */
        'redirectURI' => $this->generateUrl('SciForumVersion2Bundle_user_submission', array("key"=>$submission->getHashKey())),
        'message' => '<h3>You\'re about to be redirected...</h3>'
    );
} else {
    $data = array(
        'success' => false,
        'responseCode' => 400, /* Bad Request */
        'message' => '<h3 class="error">Cannot send form<br>* Field NAME is empty</h3>'
    );
}
$json = json_encode($data);
/* Response($data,$statusCode,$additionnalHeaders) */
return new Response($json,200,array('Content-Type'=>'application/json'));

次に、JSで

$.ajax({
    url: "uri/to/controller",
    type: "POST",
    data: values, /* Sent data */
    cache: false,
    success : function(data,e,xhr){
        if (xhr.status == 200) {
            if (data.responseCode == 200) { /* Success, just a message */
                $("#content .contentwrap .itemwrap")
                    .addClass("success")
                    .html(data.message);
            } else if (data.responseCode == 307) { /* Redirection */
                $("#content .contentwrap .itemwrap")
                    .addClass("success")
                    .html(data.message);
                setTimeout(function(){
                    $(window).attr("location",data.redirectURI);
                },3000);
            } else if (data.responseCode == 400) { /* Invalid Form */
                $("#content .contentwrap .itemwrap")
                    .addClass("error")
                    .html(data.message);
            } else { /* Could not understand Response Code */
                $("#content .contentwrap .itemwrap")
                    .html("<h3>Technical issue occured. Please come back later.</h3>");
            }
        } else {
            $("#content .contentwrap .itemwrap")
                .html("<h3>Technical issue occured. Please come back later.</h3>");
        }
    }
})

通過するパラメータを想像できます$data

私はJavascriptと通信するためにコードを使用HTTP/1.1ましたが、好きなものを使用できます 。例:

'action' => 'redirect'
'youAreGoingTo' => 'printAwesomeMessage'

JS

if (data.action == 'redirect')

if (data.youAreGoingTo == 'printAwesomeMessage')
于 2012-11-08T08:25:48.390 に答える