Symfony2 и Submit wit JavaScript: как получить html-контент

У меня есть форма в проекте 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()))); } } 

Ваша проблема в том, что вы возвращаете полный новый 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

Я использовал HTTP/1.1 коды для разговора с Javascript, но вы можете использовать все, что хотите
Пример:

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

JS

 if (data.action == 'redirect') if (data.youAreGoingTo == 'printAwesomeMessage')