【问题标题】:Return to Ajax - Error - Symfony2返回 Ajax - 错误 - Symfony2
【发布时间】:2015-08-31 00:19:37
【问题描述】:

一个多星期以来,我无法解决 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 }}

【问题讨论】:

    标签: javascript php jquery ajax symfony


    【解决方案1】:

    响应对象需要关联数组中的数据。您的代码提供了一个实体对象。您必须将该实体转换为数组。

    如果您想将所有实体数据转换为数组,则可以使用JMSSerializer。另请参阅其他stackoverflow topic

    【讨论】:

      【解决方案2】:

      尝试如下修改代码。它包括对控制器操作以及 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:

       $.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
                      }
                           }
                      }); 
      

      【讨论】:

      • 我在没有 ajax 的情况下尝试了我以前的代码,并且运行良好。问题是我需要使用 Ajax。但令人惊讶的是我得到了这个错误
      • 您是否仍然遇到同样的错误? que_unidad路径对应的控制器动作是哪个?
      • que_unidad:模式:/unidad 默认值:{ _controller: AtajoBundle:Tablas:recuperarUnidad }
      • 如果你不想打扰你,你可以给我你的电子邮件,给你发文件。
      • 控制器的问题是它返回 html。在我的回答中,我正在做的是获取 html 标记,然后对其进行 json 编码并在响应中返回。
      猜你喜欢
      • 2015-08-06
      • 1970-01-01
      • 2017-11-01
      • 1970-01-01
      • 2017-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-15
      相关资源
      最近更新 更多