Skip to content

Symfony2 Tipps und Tricks (2)

Alle Beiträge dieser Serie sind unter dem Tag sf2tt zu finden.

Weiter geht's also mit meiner kleinen Reihe "Symfony2 Tipps und Tricks". Heutiges Thema sind Formulare und Subformulare, auch bekannt als Embedded Forms, und insbesondere deren Validierung. Lest vorher am besten auch das Cookbook-Kapitel "How to Embed a Collection of Forms"(http://symfony.com/doc/current/cookbook/form/form_collections.html), um eine noch bessere Vorstellung von den ineinander geschachtelten Formularen zu bekommen.

Die Problemstellung

Häufig dienen Formulare der Bearbeitung von Daten, die aus der Datenbank kommen. Das geht auch sehr einfach, indem man eine Entity in ein entsprechendes Formular hineingibt. Allerdings muss die Entity ja nicht zwingend über ORM einer DB-Tabelle entsprechen. Entities können auch einfache Objekt sein, die Daten enhalten. Das kann schon mal sinnvoll sein, wenn man Werte aus vielen DB-Feldern zusammenziehen und anzeigen möchte.

Wie im Handbuch beispielhaft gezeigt, wird der Formtyp CategoryType ins Formular TaskType "eingebettet". Entsprechend ist Category ein Attribut von Task. Was aber, wenn statt Category ein Array von Kategorien möglich ist? Dann reicht der vorgeschlagene Constraint @Assert\Type(type="Acme\TaskBundle\Entity\Category") nicht aus bzw. die Validierung schlägt fehl, weil ja ein Array von Category-Objekten erwartet wird.

Die Lösung

Hier kommt der Valid Constraint ins Spiel. Denn sollen alle Entities Category im Array zusammen mit Task über das Formular TaskType (und das Subformular CategoryType) validiert werden, muss gewährleistet sein, dass die Validierung auch für diese greift. Das geschieht leider nicht automatisch, sondern erst, wenn das explizit verlangt wird.

namespace Sperrobjekt\Sf2ttBundle\Entity;</p>

<p>use Doctrine\ORM\Mapping as ORM,
    Sperrobjekt\Sf2ttBundle\Entity\Category;</p>

<p>/**
 * @ORM\Table(name="task")
 * @ORM\Entity
 <em>/
class Task
{
    /**
     * Array mit Kategorien vom Typ Category
     *
     * @var Category[]
     *
     * @Assert\Valid()
     */

    protected $categories;
    /</em> ... */
}

Damit wird auch das Unterformular bzw. die entsprechende Entity ganz normal validiert. Idealerweise werden Validierungsfehler noch mittels error_bubbling an das "obere" Formular durchgereicht.

Ich hoffe, das war verständlich beschrieben, und meine Lösung ist auch korrekt. Jedenfalls funktioniert es für mich damit. Ich bin aber immer für Verbesserungsvorschläge in den Kommentaren offen; schließlich gibt es auch bei Symfony2 meistens nicht nur einen Weg zum Ziel ;-)

Trackbacks

Keine Trackbacks

Kommentare

Ansicht der Kommentare: Linear | Verschachtelt

Noch keine Kommentare

Kommentar schreiben

Markdown-Formatierung erlaubt
Wenn Du Deinen Twitter Namen eingibst wird Deine Timeline in Deinem Kommentar verlinkt.
Bewirb einen Deiner letzten Artikel
Dieses Blog erlaubt Dir mit Deinem Kommentar einen Deiner letzten Artikel zu bewerben. Bitte gib Deine Blog URL als Homepage ein, dann wird eine Auswahl erscheinen, in der Du einen Artikel auswählen kannst. (Javascript erforderlich)
Standard-Text Smilies wie :-) und ;-) werden zu Bildern konvertiert.
Die angegebene E-Mail-Adresse wird nicht dargestellt, sondern nur für eventuelle Benachrichtigungen verwendet.

Um maschinelle und automatische Übertragung von Spamkommentaren zu verhindern, bitte die Zeichenfolge im dargestellten Bild in der Eingabemaske eintragen. Nur wenn die Zeichenfolge richtig eingegeben wurde, kann der Kommentar angenommen werden. Bitte beachten Sie, dass Ihr Browser Cookies unterstützen muss, um dieses Verfahren anzuwenden.
CAPTCHA

Formular-Optionen

Kommentare werden erst nach redaktioneller Prüfung freigeschaltet!