2012-09-25 18 views
7

Uaktualniliśmy z Symfony 2.0 do wersji 2.1. 2,0, kiedyś modyfikować jednostki i przeładować formularz takiego:Załaduj ponownie lub wyczyść dane w istniejącej formie w Symfony2.1

$form->setData($entity); 

Ale to już nie jest dozwolony z Symfony 2.1 (https://github.com/symfony/symfony/pull/3322). Pojawia się następujący błąd:

You cannot change the data of a bound form 

Czy istnieje sposób na ponowne powiązanie formularza z jednostką/ponowne załadowanie danych?

+0

mógłbyś zamieścić swoje rozwiązanie? – PMoubed

Odpowiedz

3

Można utworzyć nową instancję formularza i ponownie powiązać. Wydaje się, że to przesada, ale zadziałałoby to w mgnieniu oka.

+0

Tak, próbowałem, ale to jest ból, biorąc pod uwagę, że mamy formę podstawową i użyć -> usunąć w kontrolerze, aby zachować pola, których potrzebujemy. Wciąż nie sądzę, że jest inny sposób, więc dziękuję za pomoc. – Ben

+0

@Ben Utwórz 'prywatną funkcję()' na kontrolerze, który tworzy baseForm i dodaje '-> remove()' s. W ten sposób jest tak proste jak inne '$ this-> something()'. – Rixius

11

zrobiłem coś, co załatwiło sprawę ... nie wiem, czy to najlepszy sposób, ale ...

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

przez klonowanie tylko instanciated obiektu formularza, mogę przełączyć «pełną» jeden po pustym jednego, i zachowaj wszystkie parametry.

8

I najbardziej oczywistym sposobem na zresetowanie formularza po udanym poście. Ustaw "FLASH", przekierowanie do strony formy i wyświetlić zapłonu:

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

A w swojej gałązce:

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