Este foro ya no está activo, así que no puedes publicar nuevas preguntas ni responder a las preguntas existentes.

Enviar un formulario con Ajax en un vista de Symfony

30 de septiembre de 2016

Hola,

Quiero hacer el submit de un formulario para editar los datos de los usuarios de la aplicación con Ajax pero no se por qué no hace nada. Mi código es el siguiente:

En la vista:

$(document).ready(function() {
  $("#acme_userbundle_editusertype").submit(function(e) {
    e.preventDefault();
    var availableDays = $(this).data('availabledays');
    var startDate = $(this).data('date');
    var daysPerYear = $(this).data('daysperyear');
    var name = $('.user-edit-popup').data('user');             
    url="{{ path('edit_user', {'name': 'text'}) }}";
    url = url.replace("text", name);
    var datos = {
      "name" : name,
      "availableDays" : availableDays,
      "startDate" : startDate,
      "daysPerYear" : daysPerYear
    };
 
    $.ajax({
      type: 'POST',
      url: url,
      data: datos,                     
      success: function() {
        alert('Usuario Editado');
      },
      error :function() {
        alert('Error al editar');
      }
   })
  });
});

El controlador sería:

<?php
/**
 * To edit users. 
 */
public function editUserAction($name, $availableDays, $startDate, $daysPerYear){
  $user = $this->getDoctrine()->getRepository('AcmecUserBundle:ehUserInfo')
    ->findOneByLdapCn($name);     
 
  $user->setAvailableDays($daysPerYear);
  $user->setDaysPerYear($availableDays);
  $user->setsetStartDate($startDate);
 
  // persist the object to the database
  $em = $this->getDoctrine()->getManager();
  $em->persist($user);
  $em->flush();
 
  return $this->redirectToRoute('eh_homepage');
}

Respuestas

#1

Necesitaríamos saber qué tipo de error se está produciendo. ¿Se llega a ejecutar el método editUserAction()?

@javiereguiluz

30 septiembre 2016, 11:59
#2

Creo que no llega a ejecutarse, porque le puse un echo para ver si salia por pantalla y no pasa nada.

No tengo claro el error.

@helenmelenen

30 septiembre 2016, 15:17
#3

Entonces lo primero que haría es usar el inspector web del navegador para ver si la petición se está enviando o si se está produciendo algún error.

@javiereguiluz

30 septiembre 2016, 15:29
#4

@javiereguiluz te refieres a en el Console del inspector web? En tal caso, ahí no me parece ningún tipo de mensaje.

@helenmelenen

30 septiembre 2016, 16:14
#5

Si en la consola del navegador no aparecen errores, el código JavaScript es correcto. Si el controlador Symfony no se ejecuta, no parece ser un problema de Symfony (estoy asumiendo que el controlador editUserAction() tiene una ruta bien configurada).

Así que debe haber algún error en la URL de la petición Ajax. Utiliza el panel "Red" del inspector web del navegador para ver los detalles de la consulta (quizás veas por ejemplo que la respuesta te está dando un 404 o 500).

@javiereguiluz

30 septiembre 2016, 16:20
#6

El status de todos 200.

@helenmelenen

30 septiembre 2016, 16:35
#7

Pues entonces puede ser que todo esté bien ... pero se esté llamado a otro controlador de Symfony en vez de a editUserAction(). Para ver si está pasando eso, copia la URL de la petición que hace el navegador con Ajax y ejecuta el siguiente comando:

$ cd tu-proyecto-symfony/
$ ./bin/console router:match pega-aqui-la-url
 
# ejemplo
$ ./bin/console router:match /editar/usuario/nombre

El resultado del comando te dirá qué método está ejecutando Symfony para responder a esa URL. Así verás si hay algún problema con la configuración del enrutamiento.

@javiereguiluz

30 septiembre 2016, 16:40
#8

Hola @helenmelenen una de las cosas que debes hacer es que hayas "expuesto" la ruta:

my_route_to_expose:
    pattern: /foo/{id}/bar
    defaults: { _controller: HelloBundle:Hello:index }
    options:
        expose: true

@cristian_angulo

30 septiembre 2016, 16:47
#9

Hola!

Amigo @cristian_angulo corrígeme si me equivoco pero la opción "expose" se asocia al uso del bundle FOSJsRoutingBundle y si te fijas el código que ha plasmado @helenmelenen no está haciendo uso del mismo. Solo está dentro de una plantilla twig embebiendo un script y pintando una ruta con la funcion "path".

Aquí lo más posible es lo que dice @javiereguiluz debe haber colisión en las rutas, ya me ha pasado antes con rutas como "/admin/{id}" y "/admin/listado" que al intentar ingresar a la segunda ha hecho match con la primera ruta que está declarada antes y ha tomado "listado" como si fuera "id" y ahí salta el @ParamConverter con un Object not Found.

Y si muestras en la consola del navegador el resultado de la petición con:

success: function(data) {
        console.log(data);
        alert('Usuario Editado');
      },

y en tu controller devuelve un json response:

// persist the object to the database
  $em = $this->getDoctrine()->getManager();
  $em->persist($user);
  $em->flush();
 
 return new JsonResponse("Editado");

Saludos.

@RoberRielo

30 septiembre 2016, 20:40
#10

Muchas Gracias por las respuestas.

Sin embargo,probando lo que @javiereguiluz me comentó, no consigo ver el método que se está ejecutando, me dice que "No such file or directory". También probé lo que respondió @RoberRielo y tampoco funciona. Incluso probando algo tan sencillo como las siguientes líneas de codigo no me sale el alert:

$( "#acme_userbundle_editusertype" ).on( "submit", function( event ) {
    event.preventDefault();
    alert($( this ).serialize());
    console.log( $( this ).serialize() );
 
});

@helenmelenen

3 octubre 2016, 12:19