2015-05-06 11 views
5

Ich arbeite an einem Formular, das zum Senden von Benachrichtigungen verwendet wird. In der Form habe ich unter anderem ein Eingabedateifeld. In diesem Feld lade ich eine CSV-Datei. Aus der CSV-Datei (enthält eine Spalte mit E-Mails) entziehe ich die Daten mit https://code.google.com/p/jquery-csv/ und füge sie zu einem ausgewählten schreibgeschützten Mehrfachfeld mit allen ausgewählten Optionen hinzu.Symfony2 Forms - So verwenden Sie dynamische Auswahloptionen

Hinweis: Ich habe das Formular mithilfe von Formulartypen erstellt (durch das Symfony2 Buch) - class NotificationType extends AbstractType; Das Formular wird über AJAX eingereicht.

1. Streik ein zu berücksichtigen, dass das Auswahlfeld dynamisch bevölkert wird, habe ich nicht beschlossen, es zu den Formular-Builder hinzufügen, aber es mit Hilfe von JavaScript zu injizieren.

Es war ein schlechter Zug, weil Symfony2 beim Übermitteln des Formulars bestätigt, dass die Felder, die im Formular-Generator hinzugefügt wurden, genau die sind, die übergeben werden. Der zurückgegebene Fehler lautet: Dieses Formular sollte keine zusätzlichen Felder enthalten.

2. Streik zwei Geht man von Streik, den ich wollte sehen, ob ich das umgehen kann, so habe ich das Auswahlfeld im Formular-Builder, aber ohne Optionen, auch die Optionen über JavaScript zu injizieren.

Immer noch kein Glück. Symfony2 stellt außerdem sicher, dass Sie keine Option übergeben können, die beim Hinzufügen des Felds nicht zum Formular-Generator hinzugefügt wurde. Der zurückgegebene Fehler lautet: Dieser Wert ist nicht gültig.

3. Streik drei Von Schlag 1 und 2, vermute ich, dass der einzige Weg, um diese Arbeit zu machen wäre, alle möglichen Optionen in Form Builder in dem Auswahl-Array hinzuzufügen, wenn das Feld hinzufügen . Auf diese Weise würden das Feld und die Optionen für das Senden gültig sein.

Aber das ist nicht etwas, das ich als eine praktikable Option betrachten würde, vor allem weil ich im Auswahlfeld 10000 mögliche Ergebnisse erwarte, die mir nicht bekannt sind, bis ich die CSV-Datei lade.

Können Sie einen anderen Ansatz für diesen vorschlagen?

Danke!

+0

Die Verwendung von [this] (http://symfony.com/doc/current/cookbook/form/dynamic_form_modification.html#cookbook-form-events-submitted-data) Dokumentation wäre die beste Option. Aber Sie sind fast mit Ihrer 3. Implementierung da. Anstatt alle möglichen Optionen hinzuzufügen, können Sie der Option im Auswahlfeld nicht nur einen ausgewählten Wert hinzufügen. – xiidea

Antwort

4

Werfen Sie einen Blick auf dynamically modify forms (Beispiel # 3).

Sie müssen dies tun, da das Formular gegen die Builder-Optionen validiert wird. Wenn Sie also ein neues Feld hinzufügen oder seine Optionen beim Rendern ändern, weiß es nichts davon.

Oder Sie ordnen das Formular nicht einem Modell/einer Entität zu und verarbeiten es selbst.

+0

Meine Felder sind Auswahlmöglichkeiten, keine Entitäten, und ich habe keine definierten Entitätsklassen, die ich verwenden kann, danke, dass Sie mich auf die Dokumentation verwiesen haben. Jede andere Vorgehensweise, die Sie vorschlagen können? – Radu

+0

@Radu Sie können immer noch das Prinzip verwenden, wenn Felder keine Entitäten sind.Suchen Sie nicht nach Entitäten, sondern überprüfen Sie den Wert von Feld eins und legen Sie die Auswahl entsprechend fest. Wie in der Beispielzeile '$ positions = null === $ sport? array(): $ sport-> getAvailablePositions(); 'Sie könnten etwas wie 'if ($ field1value ==' foo ') {$ auswahlen = array (' alice ',' bob ',' malfoy '); } ' – Rooneyl

+0

Leichte Änderung der Anforderungen. Ich habe die ersten Details aktualisiert. – Radu

Verwandte Themen