2012-09-25 3 views
7

Abbiamo eseguito l'aggiornamento da Symfony 2.0 a 2.1. Con 2.0, che ho usato per modificare l'entità e ricaricare il modulo come questo:Ricarica o cancella dati in formato esistente in Symfony2.1

$form->setData($entity); 

Ma questo non è consentito più con Symfony 2.1 (https://github.com/symfony/symfony/pull/3322). Ottengo il seguente errore:

You cannot change the data of a bound form 

C'è un modo per associare nuovamente il modulo per l'entità/ricaricare i dati?

+0

La prego di inviare la vostra soluzione? – PMoubed

risposta

3

Bene, è possibile creare una nuova istanza del modulo e ripetere il binding. Sembra eccessivo, ma funzionerebbe in un pizzico.

+0

Sì, l'avevo provato, ma è un problema dato che abbiamo un modulo base e uso -> rimuovi nel controler per mantenere i campi di cui abbiamo bisogno. Comunque non penso che ci sia un altro modo quindi grazie per il tuo aiuto – Ben

+0

@Ben Crea una 'private function()' sul controller che crea il baseForm, e aggiunge '-> remove()' s. In questo modo è semplice come un altro '$ this-> something()'. – Rixius

11

ho fatto qualcosa che ha fatto il trucco ... Non so se è meglio, ma ...

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()) 
    ); 
} 

Clonando l'oggetto form appena istanziare, posso passare il «completo» uno per il vuoto, e mantieni tutti i parametri.

8

E il modo più ovvio per reimpostare il modulo dopo un post di successo. Impostare un "flash", reindirizzare alla pagina di modulo e visualizzare il 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(), 
    ); 
} 

E nel tuo ramoscello:

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