在页面中,我有一些用户可以点击编辑的元素。我想添加一个函数来编辑日期,只需在日历网格中拖动事件即可。用户可以通过向下拖动事件来快速编辑日期,或者单击事件以编辑更多内容。
现在,我想在用户点击某个事件时使用ajax调用来持久保存我的实体。我可以检索我的数据(event' id
和start_date
),我试图将它们放在一个简单的.txt文件中,然后就可以了。
我的阿贾克斯:
var start_date = event.start_date;
var id = id;
var edit = Routing.generate('admin_event_edit', {id : id});
$.ajax({
url: Routing.generate('admin_event_edit', {id : id}),
type: "POST",
data: { id : id, start_date : start_date},
success: function(data) {
alert('ok');
},
error: function(){
alert('error');
}
});
我在路线admin_event_edit
有一张表格
在我的控制器中:
public function editAction(Request $request, $id)
{
$em = $this->getDoctrine()->getManager();
$entity = $em->getRepository('AppBundle:Event')->find($id);
$starDate = $request->request->get('start_date');
$editForm = $this->createForm(new EventType(), $entity);
$editForm->handleRequest($request);
if ($editForm->isValid())
{
if($request->isXmlHttpRequest())
{
$entity->setStartDate($starDate);
$entity->setNotice('azeazedfdf');
$em = $this->getDoctrine()->getManager();
$em->persist($entity);
$em->flush();
}
}
return $this->redirect($this->generateUrl('admin_index'));
}
我有ajax警报ok
,我可以看到ajax调用已在symfony探查器中发送,但我的实体未更新。
我的代码出了什么问题?
由于
答案 0 :(得分:2)
$ form无效。
Symfony表格需要CSRF令牌有效,它是生成表单中的隐藏字段。
由于您使用AJAX而不是正常方式提交此表单,isValid()
检查将始终失败,因为您不会在AJAX请求中发送所有必要的数据。
示例:
<input id="form__token" class="form-control" type="hidden" value="Poo4GKPb2pcchnRXAJd74ZxLqTU2xMrgHKi8QHN4N8Y" name="form[_token]">
你需要在你的AJAX调用中发送这个值,如果没有更多的信息遗漏,你的代码应该尽我所能。
答案 1 :(得分:0)
我做到了。事实上,我不需要通过我的表格:
public function editAction(Request $request, $id)
{
$em = $this->getDoctrine()->getManager();
$entity = $em->getRepository('AppBundle:Event')->find($id);
$startDate = $request->request->get('start_date');
$endDate = $request->request->get('end_date');
if ($request->isMethod('POST'))
{
if($request->isXmlHttpRequest())
{
$entity->setStartDate(new \DateTime($startDate));
$entity->setEndDate(new \DateTime($endDate));
$em = $this->getDoctrine()->getManager();
$em->persist($entity);
$em->flush();
}
}
return //your stuff, me i don't need to be redirected
}