如何从symfony2中的render函数获取json编码

时间:2015-01-16 04:40:08

标签: php jquery ajax json symfony

我试图在symfony中使用ajax,但对我来说有些困难。我在twig中有一个表单,我获得了一个用于在我的数据库中搜索产品的值:

这是树枝上的表格:

<form id="myForm" method="post" action="{{ path('my_app_greeting') }}"> <div class="input-group"> <input id="name_id" name="name" type="text" class="form-control" placeholder="Buscar repuesto..." required /> <span class="input-group-btn"> <button id="search-button" class="btn btn-default" type="button">Buscar</button> </span> </div><!-- /input-group --></br> </form>

这是我在相同的twig模板中使用jquery的代码,用于使用ajax发送数据:

$(document).ready(function(){
    $("#myForm").submit(function(){
    var value = $("#name_id").val();
    $.ajax({
        type: "POST",
        data: { productValue: value },
        url: "/ventas/test/ajax/"
    })
    .done(function(response){
        template = response;
        $('#output').html(template.content); 
    })
    .fail(function(jqXHR, textStatus, errorThrown){
        alert('Error : ' + errorThrown);
    });
    return false;
    });
});

后来我读到了symfony如何与ajax一起工作,我认为最好的解决方案是我的问题&#34;创建一个名为&#34; ajaxContent.html.twig&#34;的新树枝模板。例如,使用控制器执行此操作:

public function testAction()
{
    $request  = $this->get('request');
    $name     = $request->request->get('productValue');
    $template = $this->renderView('AcmeDemoTwoBundle:Ventas:ajaxContent.html.twig', array('value' => $name));
    $json     = json_encode($template);
    $response = new Response($json, 200);
    $response->headers->set('Content-Type', 'application/json');
    return new Response($response);
}

之后我想将所有的html内容放在我的原始模板中但是我遇到了json编码的问题。我不太了解它是如何工作的,以及如何更好地接收数据并在树枝模板中显示它。我怎样才能做到这一点? (我尝试使用$('#output').html(template.content);显示数据,但不起作用。)

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

您在控制器中的代码似乎不太好。

我的意思是如果你想要返回json那么你为什么渲染 html (不是json)twig模板?那是第一次。

然后你可以使用JsonResponse而不是为标准响应设置标题来获得json响应。

我不知道ajaxContent.html.twig中发生了什么,但我会这样做:

public function testAction(Request $request)
{
    $name     = $request->get('productValue');
    $response = $this->get('my_response_sercive')->giveMeResponseForTestAction($name);

    return new JsonResponse($response);
}

如果您在javascript中等待html响应,则必须为您的ajax请求设置选项dataType:'html'。 然后在testAction中,您不必设置'application / json'标头,也不必使用json_encode $ template变量 - 而只是渲染模板,就像现在这样做。 所以在这种情况下你可以这样做:

public function testAction(Request $request)
{
    $name     = $request->get('productValue');

    return $this->renderView('AcmeDemoTwoBundle:Ventas:ajaxContent.html.twig', array('value' => $name));
}

之后,您可以直接将html放入#output块:

$('#output').html(response);

答案 1 :(得分:0)

您应首先使用表单数组来解决此问题

$template['content']