2012-09-25 18 views
7

Actualizamos de Symfony 2.0 a 2.1. Con 2.0, he utilizado para modificar la entidad y volver a cargar el formulario como el siguiente:Recargar o borrar datos en forma existente en Symfony2.1

$form->setData($entity); 

Pero esto no está permitido más con Symfony 2.1 (https://github.com/symfony/symfony/pull/3322). Me sale el siguiente error:

You cannot change the data of a bound form 

¿Hay una manera de volver a enlazar el formulario a la entidad/volver a cargar los datos?

+0

Podría usted por favor, puesto que su solución? – PMoubed

Respuesta

3

Bueno, podría crear una nueva instancia del formulario y volver a enlazar. Parece exagerado, pero funcionaría en caso de necesidad.

+0

Sí, lo había intentado, pero es una pena porque tenemos una forma básica y usamos -> eliminar en el controlador para mantener los campos que necesitamos. Aún así, no creo que haya otra manera, así que gracias por su ayuda. – Ben

+0

@Ben Haga una 'función privada()' en el controlador que crea el baseForm y agrega '-> remove()' s. De esta forma es tan simple como otro '$ this-> something()'. – Rixius

11

hice algo que hizo el truco ... No sé si es la mejor manera, pero ...

public function contactAction(Request $request){ 
    $task = new myBundle(); 

    $form = $this->createFormBuilder($task) 
     ->add('email', 'text', array('label'=>'E-mail')) 
     ->add('message', 'textarea') 
     ->add('newsletter', 'checkbox', array('label'=>'blabla','required'=>false)) 
     ->getForm(); 

    $cloned = clone $form; 

    if ($request->getMethod() == 'POST') { 
     $form->bindRequest($request); 
     if ($form->isValid()) { 
      [... code ...] 
      $form = $cloned; 
     } 
    } 
    return $this->render(
     'myBundle:Default:contact.html.twig', 
      array('form' => $form->createView()) 
    ); 
} 

Por clonación de la forma de objeto, simplemente instanciado, que puede conmutar el «completo», uno por el otro vacío, y mantener todos los params.

8

Y la forma más obvia de restablecer el formulario después de una publicación exitosa. Establecer un "flash", redirigir a la página de formulario y mostrar el flash:

public function contactAction(Request $request) 
{ 
    $contact = new Contact(); 
    $form = $this->createForm(new ContactType(), $contact); 

    $form->handleRequest($request); 

    if ($form->isValid()) { 
     //... 

     $session = $this->container->get('session'); 
     $session->getFlashBag()->set('success', 'Your message has been sent.'); 

     return $this->redirect($this->get('router')->generate('contact')); 
    } 

    return array(
     'form' => $form->createView(), 
    ); 
} 

Y en su rama:

{% if app.session.flashBag.has('success') %} 
    {{ app.session.flashBag.get('success')[0] }} 
{% endif %} 
Cuestiones relacionadas