返回Ajax -错误- Symfony2


Return to Ajax - Error - Symfony2

一个多星期我不能解决ajax的问题。我有一个表格,客户选择购买的产品,购买的数量,以及购买的程度(1kg, 5kg等)。一切正常,当您选择产品时,其他两个字段与相应的数量和单位将自动。当发送表单时,告诉我以下错误:

The controller must return a response (null given). Did you forget to add a return statement somewhere in your controller?

我会把所有的代码,但实际上问题应该在驱动程序。为了说明阅读并不难,我将对每一步进行评论。

1°:首先,将表单发送到视图。(显然,首先通过路由,但不去如果)

TablasController.php

public function pedidoAction()
    {
        $em = $this->getDoctrine()->getManager();
        $prodped= new ProdPedido();//creo la entidad de los productos
        $form = $this->createForm(new ProdPedidoType(), $prodped);
        $nombres = $em->getRepository('ProyectoAdminBundle:Catalogo')->findByArticulo();

        return $this->render('AtajoBundle:General:pedido.html.twig', array('form' => $form->createView(), 'nombres' => $nombres));
    }

2°:我减少了一些代码,所以不太长。在这里,我展示了表单,并编写了相应的javascript来处理动态添加字段,以及前面提到的自动完成字段。虽然这对这种情况没有太大影响,因为问题可能出在控制器上。

pedido.html.twig

{% block content %}
  <section class="pedido">

<form id="formulario" action="{{ path('crear_pedido', { 'id': app.user.id } ) }}" method="post" {{ form_enctype(form) }}>
{{ form_start (form) }}
{{ form_errors(form) }}
    <div id="agrega">
    <ul>
        <li>{{ form_label(form.producto, 'Nombre del producto: ') }}</li>
        <li>{{ form_label(form.cantidad, 'Cantidad que va a llevar: ') }}</li>
        <li>{{ form_label(form.valor, 'Valor en numero (KGS/LTS): ') }}</li>
    </ul>
    <ul class="ul_0">
        <li>{{ form_widget(form.producto, { 'attr': {'class': 'producto_0'} }) }}</li>
        <li>{{ form_widget(form.cantidad, { 'attr': {'class': 'cantidad_0'} }) }}</li>
        <li>{{ form_widget(form.valor, { 'attr': {'class': 'medida_0'} }) }}</li>
    </ul>
    </div>

<div ><input id="agregarCampo" type="button" value="Agregar Producto"/></div>
<div ><input id="quitarCampo" type="button" value="Quitar Producto"/></div>
<div ><input id="enviar" type="submit" id="submit"/></div>
{{ form_end (form) }}
 </section>
{% endblock %}
{% block javascripts %}
    {{ parent() }}
    <script type="text/javascript" src=" {{ asset('bundles/MICARPETA/js/jquery-2.1.4.min.js') }} "></script>
    <script type="text/javascript">
    $(document).ready(function() {
    var loqueagrego;
    var busqueda = $('#busqueda');
    var contenedor       = $("#agrega"); //ID del contenedor
    var AddButton       = $("#agregarCampo"); //ID del Botón Agregar
    var QuitButton = $("#quitarCampo");
    var productos = '{% for nombre in nombres %}<option value="{{ nombre.articulo }}"> {{ nombre.articulo }} </option>{% endfor %}';
    var x = 1;
    //agregar boton
    $(AddButton).click(function (e) {
          //el html que voy a agregar
           loqueagrego = '<ul>';
           loqueagrego = loqueagrego + '<li><label>Nombre del producto: </label></li>';
           loqueagrego = loqueagrego + '<li><label>Cantidad que va a llevar: </label></li>';
           loqueagrego = loqueagrego + '<li><label>Valor en numero (KGS/LTS): </label></li>';
           loqueagrego = loqueagrego + '</ul>';
           loqueagrego = loqueagrego + '<ul class="ul_'+x+'">';
           loqueagrego = loqueagrego + '<li><select class="producto_0" name="producto[]">'+ productos +'</select></li>';
           loqueagrego = loqueagrego + '<li><select class="cantidad_0" name="cantidad[]"></select></li>';
           loqueagrego = loqueagrego + '<li><select class="medida_0" name="medida[]"></select></li>';
           loqueagrego = loqueagrego + '</ul>';
           //lo agrego
           $(contenedor).append(loqueagrego);
           x++; //sumo la cantidad de campos que hay
        return false;
    });

    //quitar boton
    $(QuitButton).click(function (e){
       if (x !== 1){ // si es distinto a 1, remuevo los input que no deseo
       $("#agrega ul:last-child").remove();
       $("#agrega ul:last-child").remove();
       x--;
       }
       return false; 
    });
    //le digo que todos los que se agreguen dinamicamente tambien van a ser afectados
    $('#agrega').on("change",".producto_0", function(e){ 
    var elegido = $(this).val();
    var medidahermano = $(this).parent().parent().attr("class");
    var cantidadhermano = medidahermano;
    medidahermano = $('.'+ medidahermano +' li:last-child');//recupero el ultimo hijo
    medidahermano = medidahermano.children(1); //recupero el primer hijo
    cantidadhermano = $('.'+ cantidadhermano +' li:nth-child(2)');
    cantidadhermano = cantidadhermano.children(1);

      var solido;
      var liquido;
      solido = '<option value="1">1</option>';
      solido = solido + '<option value="5">5</option>';
      solido = solido + '<option value="10">10</option>';
      solido = solido + '<option value="15">15</option>';
      solido = solido + '<option value="20">20</option>';
      solido = solido + '<option value="30">30</option>';
      solido = solido + '<option value="50">50</option>';
      solido = solido + '<option value="100">100</option>';
      liquido = '<option value="6">6</option>'
      liquido = liquido + '<option value="12">12</option>';
      liquido = liquido + '<option value="24">24</option>';
      liquido = liquido + '<option value="48">48</option>';
      liquido = liquido + '<option value="12">96</option>';
    $.ajax({
                          type: "POST",
                          url: "{{ path('que_unidad') }}",
                          data: { 'id' : ' ' + elegido + ' ' },
                          error: function(){
                                alert("Error petición Ajax");
                          },
                          success: function(data){    
                                alert(data);                                               
                                if(data == 'KG' | data == 'unidad'){
                                  $(cantidadhermano).html(solido);
                                }

                                else if(data == 'LTS'){
                                  $(cantidadhermano).html(liquido); 
                                }   
                                $.ajax({
                                          type: "POST",
                                          url: "{{ path('medidas_y_unidades') }}",
                                          data: { 'id' : ' ' + elegido + ' ' },
                                          error: function(){
                                                alert("Error petición ajax");
                                          },
                                          success: function(data){                                                    
                                                $(medidahermano).html(data);
                                          }
                                }); 
                          }
  }); 
     });
});


</script> 
{% endblock %}

3°:这是假设该错误。对我来说,这是将信息返回给ajax的一种方式,但实际上并不是这样,因为它看起来很好。通过视图返回信息,一切正常,字段将自动。但是在发送表单时,我得到了这个错误

TablasController.php

public function recuperarMedidasyUnidadesAction(){
        $id = $_POST['id'];
        $em = $this->getDoctrine()->getManager();
        // busco las diferentes unidades que existen (1kg, 5kg, 10kg, etc)
        $medidas = $em->getRepository('ProyectoAdminBundle:Unidades')->findByUnidadesJoinCatalogo($id);
        return $this->render('AtajoBundle:Ajax:medidasYUnidades.html.twig', array('medidas' => $medidas));
    }
    public function recuperarUnidadAction(){
        $id = $_POST['id'];
        $em = $this->getDoctrine()->getManager();
        // busco las diferentes unidades que existen (1kg, 5kg, 10kg, etc)
        $unidad = $em->getRepository('ProyectoAdminBundle:Categoria')->findByUnidad($id);
        return $this->render('AtajoBundle:Ajax:unidad.html.twig', array('unidad' => $unidad));
    }

4°:视图

medidasYUnidades.html.twig

{% for medida in medidas  %}
<option value="{{ medida.medida }}">{{ medida.medida }}</option>
{% endfor %}

unidad.html.twig

{{ unidad.unidad }}

响应对象需要关联数组中的数据。你的代码给出了一个实体对象。你必须把那个实体转换成数组。

如果你想把所有实体数据转换成一个数组,那么你可以使用JMSSerializer。另请参阅其他stackoverflow主题

尝试按如下所示修改代码。控件中的ajax调用以及对控制器操作的更改模板。

public function recuperarMedidasyUnidadesAction(){
$id = $_POST['id'];
$em = $this->getDoctrine()->getManager();
// busco las diferentes unidades que existen (1kg, 5kg, 10kg, etc)
$medidas = $em->getRepository('ProyectoAdminBundle:Unidades')->findByUnidadesJoinCatalogo($id);
//modified code
$status = 'error';
$html = '';
if($medidas){
    $data =$this->render('AtajoBundle:Ajax:medidasYUnidades.html.twig', array('medidas' => $medidas));
    $status = 'success';
    $html = $data->getContent();
}
$jsonArray = array(
    'status' => $status,
    'data' => $html,
);
$response = new Response(json_encode($jsonArray));
$response->headers->set('Content-Type', 'application/json; charset=utf-8');
return $response;

}

 public function recuperarUnidadAction(){
        $id = $_POST['id'];
        $em = $this->getDoctrine()->getManager();
        // busco las diferentes unidades que existen (1kg, 5kg, 10kg, etc)
        $unidad = $em->getRepository('ProyectoAdminBundle:Categoria')->findByUnidad($id);
         //modified code
        $status = 'error';
        $html = '';
        if($unidad){
            $data = $this->render('AtajoBundle:Ajax:unidad.html.twig', array('unidad' => $unidad));
            $status = 'success';
            $html = $data->getContent();
        }
        $jsonArray = array(
            'status' => $status,
            'data' => $html,
        );
        $response = new Response(json_encode($jsonArray));
        $response->headers->set('Content-Type', 'application/json; charset=utf-8');
        return $response;
    }

JavaScript in template:

 $.ajax({
              type: "POST",
              url: "{{ path('medidas_y_unidades') }}",
              data: { 'id' : ' ' + elegido + ' ' },
              error: function(){
                    alert("Error petición ajax");
              },
              success: function(result, request) {
              var parsedData =JSON.parse(result);
                if(parsedData.status ==='success'){
                    userListDiv.html(parsedData.data);
                     $(medidahermano).html(parsedData.data);
                }else{
                    //handle no result case
                }
                     }
                });