2014-01-21 10 views
6

Ich möchte ein Formular für eine Entität erstellen, die viele Attribute hat. Um die Dateneingabe zu vereinfachen, möchte ich dieses Formular in mehrere Seiten aufteilen (z. B. 2 oder 3 Seiten). ist die Anzeige Einheit Beispiel nehmen lassen:wie lange symfony Form in mehrere Seiten aufgeteilt werden?

  1. In Seite 1, wird der Benutzer
  2. In Seite 2, um den Anzeigentext eingeben, wird der Benutzer seine Kontaktdaten eingeben
  3. Auf der Seite 3 liefert der Benutzer die (X, Y) Position der Anzeige

Diese Spaltung erfordert die verfügbaren Daten zu speichern (Einfügen in der Datenbank) in der ersten Seite vor zur nächsten Seite zu bewegen. Leider ist dies aufgrund von Einschränkungen nicht möglich.

Die Frage ist: Gibt es Dokumentationen oder Beispiele, die dieses Problem lösen?

Wenn keine Dokumentation verfügbar ist, denken Sie, es ist besser, meine Entity in n Entitäten zu teilen, um eine Entität pro Seite zu haben?

Danke für Ihre Hilfe.

Antwort

10

Sie sollten wahrscheinlich CraueFormFlowBundle verwenden. Es bietet Möglichkeiten zum Erstellen mehrstufiger Formulare.

Sie können einen Formulartyp für einen gesamten Fluss oder einen Formulartyp pro Schritt erstellen.

Es ist sehr einfach einzurichten. Alles wird erklärt here.

+0

Vielen Dank. Scheint eine großartige Lösung zu sein! :) –

+0

Absolut perfekt! Danke noch einmal! –

+0

Ich bezweifle, dass ein Bündel eine großartige Lösung sein könnte. Persönlich bevorzugen oft Codierung als eine gute Lösung. – Trix

0

Sie könnten alle übermittelten Daten in einer Sitzung oder temporären Tabelle speichern und dann am Ende alle zusammen speichern. Ich tue mein Bestes, um zusätzliche Arbeit wie diese zu vermeiden.

Ich denke, es kann gut sein, dass Ihre Formularschritte der Reihenfolge folgen, nach der die Einschränkungen diktieren.

Das sagend, manchmal denke ich, dass diese Art von Problem gelöst werden kann, indem man eine bessere Design- oder Prozessentscheidung trifft. d. h., begrenzen Sie die Anzahl der Fragen oder fragen Sie nur die wichtigsten zuerst. Ohne die Einzelheiten zu kennen, ist es schwer zu wissen, ob dies möglich ist.

+0

vielen Dank ... –

+0

Sitzung ist kein guter Ort und wird zu Missbrauch führen. Ich würde einen Cache verwenden. –

7

Sie müssen Ihre Entität nicht aufteilen, sondern Ihr Formular: Erstellen Sie 3 Formulare, von denen jedes die von der Anzeigentität benötigte Eigenschaft enthält.

Sie werden müssen:

  • bestehen (und nicht bündig) das $ ad Objekt bei jedem Schritt in Ihrem Controller
  • die $ ad-Objekt als Argument übergeben, wenn in Ihrem Controller Spedition
  • spülen $ ad Objekt im letzten Schritt

in Pseudo-Code, würde Ihren Controller wie folgt aussehen:

public function newAdStep1() { 
    new Ad() // New instance of $ad 
    new formStep1($ad) // The first form containing only the ad text field 

    // The form was filled, manage it... 
    form->isValid()? { 
     persist($ad); // Persist the first part of your ad object 
     forward(newAdStep2, $ad) // Go on to step 2, your $ad object as an argument 
    } 

    // ... or display step1 to user 
    createView createAdStep1.html.twig('form' => $form); 
} 

public function newAdStep2($ad) { 
    new formStep2($ad); // Now the second form, containing the "contact" fields 
    isValid ? { 
     persist($ad) 
     forward(newAdStep3, $ad) 
    } 
    createView createAdStep2($form, $ad); // Your $ad object needs to be sent to the view 
} 

public function newAdStep3($ad) { 
    new formStep3($ad); // Third and last form, containing the (X,Y) fields 
    isValid ? { 
     $em->persist($ad); 
     $em->flush(); // Your instance of $ad can be stored in database now 
     return('success !'); 
    } 
    return view createAdStep3($form, $ad); 
} 
+0

Vielen Dank. Ich muss deine Lösung versuchen. Ich bin ein bisschen besorgt wegen der isValid(). –

+0

Ich habe es versucht, und IsValid gibt True nach der createForm zurück, so dass diese Lösung möglicherweise nicht realisierbar ist. Allerdings ist das Konzept der Verwendung von Forwards ziemlich geschickt. – crafter

+0

Es könnte hilfreich sein, wenn Sie Ihr Code-Snippet überarbeiten und durch den Code der realen Welt ersetzen. – Trix