无法通过ajax在symfony2中保存实体,表单无效

时间:2015-02-03 01:34:22

标签: php jquery ajax forms symfony

我正在尝试使用控制器从ajax请求接收的数据来保存表单。我似乎有一个问题将数据绑定到控制器中的新Symfony表单。当控制器收到带有我的数据的表单时,日志记录显示isValid方法似乎失败了[] []。我怀疑我的控制器有问题,但我是Symfony2的新手,不确定如何让我的数据正确地与表格捆绑。

jQuery Ajax POST

  $( document ).on( "submit", function(e){
            e.preventDefault();

            var $form = $('form.agency');

            var $url = $form.attr('action');

            var $data = $form.serialize();

            var $form_tag = $form.parent().attr('id').split('_');

            var $id = $form_tag[2];

            $.post($url, //ajax_return_agencies
                    {uid: $id, data: $data},
                    function (response) {
                        if(response.success) {
                            $('#result').html('SUCCESS');
                        }else{
                            alert('failed');
                        }
                    });
        });

Symfony2控制器

 public function updateAction(Request $request)
{
    $logger = $this->get('logger');

    $id = $request->request->get('uid');

    $em = $this->getDoctrine()->getManager();
    $entity = $em->getRepository('ShuttleItGtfsBundle:ShuttleitAgencies')->find($id);
    $form = $this->createForm(new AgencyType(), $entity);
    $form->handleRequest($request);


    if ($form->isValid()) {

        $em->persist($entity);
        $em->flush();

        if($request->isXmlHttpRequest()) {
            $response = new Response();
            $output = array('success' => true);
            $response->headers->set('Content-Type', 'application/json');
            $response->setContent(json_encode($output));

            return $response;
        }
    }

    $errors = $form->getErrorsAsString();
    $errors = explode("\n", $errors);
    $response = array("code" => 100, "success" => false, "data_bundle" => $errors);
    return new Response(json_encode($response));
}

枝条

<h1>Agency creation</h1>
<span id="{{ type }}_form_{{ id }}">
<form class="{{ type }}" action="{{ path('set_element') }}" method="post" {{ form_enctype(form) }}>
    {{ form_widget(form) }}
    <p>
        <button type="submit">Create</button>
    </p>
</form>
</span>
<ul class="record_actions">
    <li>
        <a href="#">
            Back to the list
        </a>
    </li>
</ul>
<div id="result"></div>

1 个答案:

答案 0 :(得分:1)

我认为问题在于您在data元素中传递表单数据。虽然symfony期望表单数据位于$_POST数组的“根”中。 如果建议您将id作为url的一部分传递,但是,如果您想坚持原始解决方案,请尝试以下方法:

    var url = $('form.agency').attr('action');

    var data = $('form.agency').serialize();

    var form_tag = $('form.agency').parent().attr('id').split('_');

    var id = form_tag[2];
    data.id = id;

    $.post(url, data,
            function (response) {
                if(response.success) {
                    $('#result').html('SUCCESS');
                }else{
                    alert('failed');
                }
            });

当我需要使用ajax提交表单时,我通常会使用以下内容:

  $.ajax({
    type: 'PUT',
    url: Routing.generate('frontend_edit_entity', {id:id}),
    data: data,
    dataType: 'json',
    success: function (response) {
        /* .. */
    }
});

<强> P.S。

如果您要以JsonResponse格式发送回复,建议您使用JSON