2013-12-10 7 views
5

Si supponga per un momento che questo modulo utilizzi una classe di oggetto documento Animal immaginaria da un ZooCollection che ha solo due proprietà ("nome" e "colore") in .Symfony2 Form campi di pre-riempimento con dati

Sto cercando un lavoro soluzione semplice stupido, a pre-compilare icampi del modulo con l'oggetto di auto-magicamente (ad es. Per gli aggiornamenti?).

Acme/DemoBundle/Controller/CustomController:

public function updateAnimalAction(Request $request) 
{ 
    ... 
    // Create the form and handle the request 
    $form = $this->createForm(AnimalType(), $animal); 

    // Set the data again   << doesn't work ? 
    $form->setData($form->getData()); 
    $form->handleRequest($request); 
    ... 
} 
+0

Che dire basta impostare le proprietà dell'oggetto animale? –

risposta

6

Si dovrebbe caricare l'oggetto animale, che si wan per aggiornare. createForm() utilizzerà l'oggetto caricato per riempire il campo nel modulo.

si Supponendo che stanno usando le annotazioni per definire i percorsi:

/** 
* @Route("/animal/{animal}") 
* @Method("PUT") 
*/ 
public function updateAnimalAction(Request $request, Animal $animal) { 
    $form = $this->createForm(AnimalType(), $animal, array(
     'method' => 'PUT', // You have to specify the method, if you are using PUT 
          // method otherwise handleRequest() can't 
          // process your request. 
    )); 

    $form->handleRequest($request); 
    if ($form->isValid()) { 
     ... 
    } 
    ... 
} 

penso che la sua sempre una buona idea per imparare dal codice generato da comandi della console dottrina (doctrine:generate:crud) Symfony e. Puoi imparare l'idea e il modo in cui dovresti gestire questo tipo di richieste.

1

Creare il modulo utilizzando l'oggetto è l'approccio migliore (vedere la risposta di @ dtengeri). Ma potresti anche usare $form->setData() con un array associativo, e questo suona come quello che stavi chiedendo. Ciò è utile quando non si utilizza un ORM o se è sufficiente modificare un sottoinsieme dei dati del modulo.

Il massiccia Gotcha è che tutti i valori di default nel vostro costruttore modulo saranno non essere sovrascritti da setData(). Questo è contro-intuitivo, ma è come funziona Symfony. Discussione: