2017-05-12 2 views
0

Ich möchte Symfony 2.8 verwenden, um ein Formular für Datenklasse zu erstellen, z. Task wie in der Symfony docs verwendet.So ordnen Sie eine Klassenvariable in Symfony zwei Formularfeldern zu

Meine Task Klasse verwendet ein Integer-Feld flags, um eine Sammlung verschiedener Bool-Werte zu speichern. Zum Beispiel wird der Wert von is completed wird als das erste Bit und is urgent als zweites Bit gespeichert:

  • Task nicht abgeschlossen und nicht dringend -> flags = 0
  • Aufgabe abgeschlossen ist und nicht dringend -> flags = 1
  • Aufgabe ist nicht abgeschlossen und dringend -> Flaggen = 2
  • Aufgabe abgeschlossen und dringlich ist -> flags = 3
  • ...

Das Problem: Wie kann das einzelne Klassenfeld auf zwei verschiedene Formularfelder und zurück abgebildet werden?

$builder 
    // map first bit to checkbox 
    ->add('is_complete', CheckboxType::class, array(
      ... 
     ) 
    ) 
    // map second bit to selection box "normal"/"urgent" 
    ->add('is_urgend', ChoiceType::class, array(
      ... 
     ) 
    ) 
    ... 

Was ist die richtige Lösung, um dies zu lösen? Kann dies durch eine Datentransformatoren gehandhabt werden? So weit ich weiß, kann ein Transformator ein Feld von einem in einen anderen Typ umwandeln, aber nicht ein Feld in zwei Felder. Ist das korrekt?

Die einzige Lösung, die ich bisher gefunden habe, ist die Erstellung einer Wrapper-Klasse TaskWrapper, die keine Flags verwendet, sondern für jeden Flag-Wert verschiedene Bool-Felder anbietet. Diese Klasse könnte dann anstelle der ursprünglichen Klasse Task an das Formular übergeben werden. Sobald das Formular übergeben wurde, kann das zurückgegebene Wrapperobjekt manuell in ein Task Objekt zurückübersetzt werden.

Das würde funktionieren, aber es ist keine saubere Lösung. Ist das der richtige Weg oder gibt es eine bessere Lösung mit Symfony Tools?

+0

Warum würden Sie nicht zwei verschiedene booleans speichern? Einer für "abgeschlossen" und der andere für "dringend"? –

+0

Dies ist nur ein Beispiel, die reale Entitätsklasse verwendet das Feld 'flags', um noch mehr Werte zu speichern. Außerdem ist es an eine externe API gebunden, die ich nicht ändern kann. Daher macht die Verwendung von Flags in diesem Fall wirklich Sinn. –

+0

Ich würde die Flags als separate Attribute speichern und eine Coder/Decoder-Klasse schreiben, um mit der externen API zu sprechen. –

Antwort

1

Ich würde für mehrere boolesche Eigenschaften gehen. Es ist einfacher auf Form- und Persistenzebene.

Wenn Sie diese $flags-Eigenschaft verwenden müssen und Doctrine verwenden, können Sie die mehreren booleschen Eigenschaften verwenden, ohne sie zuzuordnen. Wenn ein Formular die Felder Vorlage direkt auf die Elementeigenschaften zugeordnet werden, ausgenommen diejenigen mit mapped = false: http://symfony.com/doc/current/reference/forms/types/form.html#mapped

Dann ein Eventlistener für Veranstaltungen prePersist und preUpdate implementieren, die die flags Eigenschaft vor der Erstellung/Aktualisierung der Aufgabe:

Konsistenz Sie Zur Wahrung kann die $urgent und $complete Eigenschaft Werte durch setFlags() setzen, da es nur entweder manuell oder beim Laden der Entität aufgerufen wird.

Verwandte Themen