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
Necesitaríamos saber qué tipo de error se está produciendo. ¿Se llega a ejecutar el método editUserAction()
?
@javiereguiluz
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
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
@javiereguiluz te refieres a en el Console del inspector web? En tal caso, ahí no me parece ningún tipo de mensaje.
@helenmelenen
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
El status de todos 200.
@helenmelenen
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
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
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
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