symfony2:使用ajax持久化实体

时间:2015-12-29 13:19:36

标签: php jquery ajax symfony

在页面中,我有一些用户可以点击编辑的元素。我想添加一个函数来编辑日期,只需在日历网格中拖动事件即可。用户可以通过向下拖动事件来快速编辑日期,或者单击事件以编辑更多内容。

现在,我想在用户点击某个事件时使用ajax调用来持久保存我的实体。我可以检索我的数据(event' idstart_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探查器中发送,但我的实体未更新。 我的代码出了什么问题?

由于

2 个答案:

答案 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
}