我正在开发一个评论框,通过JQuery AJAX调用来保存注释.
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()) {
此检查未返回true.在else中我提取了哪些错误消息,并得到:
Array ( [0] => The CSRF token is invalid. Please try to resubmit the form )
CSRF令牌正在通过邮件传递,就像同时提交表单一样.
另一个可能的问题..唯一的表单ID
我使用的形式是由表单类型类创建的.在任何给定的页面上都会有几个注释表单.由于symfony2使用类型类的getName()方法来填充表单ID属性,所以我修改了它:
public function getName() { return 'discussionForm' . $randomNumber; }
这允许不具有相同id的多个注释表单.讨论框20,讨论框21,讨论框22等
解决方法
尝试使用足够的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字段!