2012-01-25 24 views
15

Estoy desarrollando un cuadro de comentarios que guardará el comentario a través de una llamada JQuery AJAX.Formulario Symfony2 con CSRF pasado a través de JQuery AJAX

JQuery

Aquí está el código JQuery para que (esto funciona sin problemas):

$(".post-comment").click(function() { 
    var $form = $(this).closest("form"); 

    if($form) 
    { 
     $.ajax({ 
      type: "POST", 
      url: Routing.generate('discussion_create'), 
      data: $form.serialize(), 
      cache: false, 
      success: function(html){ 
       alert("Success!"); 
       // Output something     
      } 
     }); 
    } 
    else 
    { 
     alert("An error occured"); 
    } 
    return false; 
}); 

Controller Symfony2

El método controlador Symfony2 continuación, recoge los datos y procesos de formulario eso. Como parte de ese proceso, comprueba si el formulario es válido:

$entry = new Discussion(); 
$discussionForm = $this->createForm(new DiscussionType(), $entry); 

if ($request->getMethod() == 'POST') { 

    $discussionForm->bindRequest($request); 

    if ($discussionForm->isValid()) { 

Esta comprobación no se cumple. En el otro extraigo lo que los mensajes de error se les ha dado y obtener:

Array 
(
    [0] => The CSRF token is invalid. Please try to resubmit the form 
) 

El token CSRF se está pasando a través de correo tal como lo haría si el formulario se ha enviado de forma sincrónica.

Otro posible problema .. Formulario de identificación únicos

La forma estoy usando es creado por una clase de tipo de formulario. En cualquier página dada, habrá varios formularios de comentarios. Como Symfony2 utiliza el método getName() de la clase tipo para poblar el atributo formas ID, he modificado así:

public function getName() 
{ 
    return 'discussionForm' . $randomNumber; 
} 

Esto permite que varios comentarios formas sin el mismo ID, por ejemplo, discussionForm20, discussionForm21, discussionForm22 etc.

Podría eliminar el componente de formulario symfony2 de la mezcla y generar el formulario/procesar la presentación usando la lógica PHP estándar, pero me resisto a eso por ahora.

¿Alguien sabe por qué el token CSRF de formularios no es válido? ¿Alguna sugerencia sobre cómo esto podría ser modificado o cómo lo haces?

Respuesta

28

Pruebe con la función JQuery adecuada: submit() ^^ En mi solución, supongo que su formulario tiene el id "comment_form". Funciona en todos mis proyectos sf2:

$('#comment_form').submit(function(e) { 

    var url = $(this).attr("action"); 

    $.ajax({ 
     type: "POST", 
     url: url, // Or your url generator like Routing.generate('discussion_create') 
     data: $(this).serialize(), 
     dataType: "html", 
     success: function(msg){ 

      alert("Success!"); 

     } 
    }); 

    return false; 

}); 

¡Normalmente se enviaría el campo CSRF!

Y no olvides agregar la etiqueta twig {{form_rest (form)}} en tu plantilla de formulario, que generará todo el campo oculto como CSRF.

+1

el método de envío JQuery no es importante aquí. Lo que hace que funcione es que la llamada $ .ajax toma todos los datos de forma serializada en el parámetro de datos. –

Cuestiones relacionadas