Symfony2和提交机智JavaScript:如何获取HTML内容 [英] Symfony2 and Submit wit JavaScript: How to get html content
问题描述
我在Symfony2项目中有一个表单,我需要提交表单。第一个想法是使用ajax提交,但问题是这不会通过symfony2所需的验证,我收到CSRF错误消息(请参阅我的判断问题: Symfony2:CSRF令牌无效。请尝试重新提交表单。
I have a form in Symfony2 project and I need to submit form. The first idea was to submit using ajax but the problem is that this will not pass the symfony2 required validation and I am getting the CSRF error message (see my precedant question : Symfony2: The CSRF token is invalid. Please try to resubmit the form).
感谢@ Elnur的答案,我现在可以使用$ post提交表格,但还有其他问题。
Thank's to @Elnur's answer, I am able now to submit the form using $post but have another problem.
With Ajay,我收到了一个html响应,我能够将这个响应设置为HTML元素:
With Ajay, I am getting back an html response and I was able to asign this response to an HTML element:
$.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>
</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;"> </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>
但是现在,当使用帖子时:
But now, when using post:
$.post($this.attr('action'), $this.serialize(), function (data) {
$("#content .contentwrap .itemwrap").html( data );
});
我不再获取HTML但是JSON格式化响应我不知道如何提取他正确的信息来自。
I am not getting anymore HTML but a JSON formated response and I don't know how to extract he right information from.
以下是我从帖子中得到的回复:
Here is the response I am getting from the post:
{"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可以理解的信息并按照你想要的方式对待。
Your issue is that you're returning a full new HTML content.
You need to return only informations that your JS can understand and treat the way you want.
use Symfony\Component\HttpFoundation\Response;
SF中的此类允许您返回普通内容。
This class in SF allows you to return plain content.
这是一种使用它的方法。
Here's a way to use it.
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
You could imagine any parameter to pass through $data
我用 HTTP / 1.1
使用Javascript代码 talk ,但你可以使用你想要的任何东西
Ex:
I used HTTP/1.1
codes to talk with Javascript but you can use anything you want
Ex:
'action' => 'redirect'
'youAreGoingTo' => 'printAwesomeMessage'
JS
if (data.action == 'redirect')
if (data.youAreGoingTo == 'printAwesomeMessage')
这篇关于Symfony2和提交机智JavaScript:如何获取HTML内容的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!