symfony : können wir nicht eine versteckte Einheit-Feld?
Ich bin die Darstellung einer form mit einer Entität Feld in symfony.
Es funktioniert gut, wenn ich wählen Sie ein regelmäßiger Entität Feld.
$builder
->add('parent','entity',array(
'class' => 'AppBundle:FoodAnalytics\Recipe',
'attr' => array(
'class' => 'hidden'
)
))
Wirft er folgenden Fehler wenn ich wählen ->add('parent','hidden') :
Des Formulars anzeigen von Daten wird erwartet, dass sein Typ Skalar, array oder ein
Instanz von \ArrayAccess, aber eine Instanz der Klasse
AppBundle\Entity\FoodAnalytics\Rezept. Sie können diesen Fehler vermeiden, indem Sie
die Einstellung "data_class" - option, um
"AppBundle\Entity\FoodAnalytics\Rezept" oder durch das hinzufügen einer Ansicht
Transformator wandelt eine Instanz der Klasse
AppBundle\Entity\FoodAnalytics\Rezept Skalar, array oder eine Instanz
der \ArrayAccess. 500 Internal Server Error - LogicException
Können wir uns nicht versteckt haben Entität Felder ?? Warum nicht? Bin ich verpflichtet, ein weiteres verstecktes Feld zum abrufen der Entität id?
EDIT :
Im Grunde, was ich versuche zu tun, ist zu Hydrat der form, bevor es angezeigt wird aber verhindern, dass der Benutzer das ändern eines seiner Felder (die Eltern hier).
Dies ist, weil ich mich übergeben zu müssen, die die Id als parameter, und ich kann es nicht in der form action url.
InformationsquelleAutor der Frage Sébastien | 2014-11-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke, Sie sind einfach verwirrt über die Feld-Typen und was Sie jeweils darstellen.
Einer
entity
Feld ist eine Art vonchoice
Feld. Auswahl-Felder sind dazu gedacht, die Werte enthalten, wählbar durch einen Benutzer in einem Formular. Wenn Sie dieses Formular gerendert wird, Symfony generiert eine Liste von Auswahlmöglichkeiten auf der Basis der zugrunde liegenden Klasse der Entität, Feld, und der Wert jeder Wahl in der Liste die id der jeweiligen Person. Sobald das Formular abgeschickt wird, Symfony wird das Hydrat ein Objekt für Sie für die ausgewählte Entität. Dieentity
Feld typischerweise wird für die Darstellung von entity-Verbände (wie zum Beispiel eine Liste vonroles
Sie können wählen Sie zuweisen, um eineuser
).Wenn Sie einfach versuchen, erstellen Sie einen Platzhalter für ein Feld ID der Entität, und Sie würde den
hidden
Eingang. Aber das funktioniert nur, wenn der form-Klasse, die Sie erstellen, stellt eine Entität (D. H. die form istdata_class
bezieht sich auf eine Entität, die Sie definiert haben). Das Feld ID wird dann richtig anzeigen, um die ID einer Entität des Typs definiert durch die formdata_class
.EDIT: Eine Lösung für Ihre Besondere situation, die weiter unten beschrieben werden würde, zum erstellen einer neuen Feld-Typ (nennen wir es EntityHidden) erstreckt, die
hidden
Feld Typ, aber verarbeitet Daten transformation für die Umwandlung zu/aus einer Entität/id. Auf diese Weise, Ihr Formular enthält die entity-ID als hidden-Feld, aber die Anwendung hat Zugriff auf die Entität selbst, sobald das Formular abgeschickt wird. Die Konvertierung ist natürlich, durchgeführt von der data transformer.Hier ist ein Beispiel für eine solche Umsetzung für die Nachwelt:
Nur beachten, dass die in der form Typ-Klasse, alles, was Sie tun müssen, ist, weisen Sie Ihre verborgene Einheit auf das entsprechende Formular-Feld-Eigenschaft (in der form das Modell/Daten-Klasse) und Symfony generiert die verdeckte Eingabe von HTML richtig mit der ID der Person als Wert. Hoffe, das hilft.
InformationsquelleAutor der Antwort Haig Bedrosian
Nur aus dieser auf Symfony 3 und realisiert es ein bisschen anders aus, was bereits hier gepostet, so dass ich dachte, es war es Wert.
Ich habe gerade eine generische Daten-Transformator, die leicht wiederverwendbar für alle Ihre Formular-Typen. Sie bestehen in Ihrer form geben und das ist es. Keine Notwendigkeit, erstellen Sie eine benutzerdefinierte form geben.
Zunächst werfen wir einen Blick auf die Daten Transformator:
Also die Idee ist, dass Sie rufen es durch die übergabe der Objekt-manager gibt es, die Entität, die Sie verwenden möchten, und dann den Namen des Feldes, um die entity-ID.
Grundsätzlich so:
Let ' s put it all together now. Wir müssen nur die form geben und ein bisschen YAML-Konfiguration und dann sind wir gut zu gehen.
Und dann in Ihre
services.yml
Datei:Und in Ihrem controller:
Ist es 🙂
InformationsquelleAutor der Antwort Francesco Casula
Einer schnellen Lösung, ohne die Schaffung neuer Transformator und Typ-Klassen. Wenn Sie möchten, Auffüllen, eine verknüpfte Entität aus der db.
Diese Ergebnisse eine einzelne verdeckte Auswahl wie:
Aber ja, ich Stimme zu, dass mit ein wenig mehr Aufwand durch ein
DataTransformer
kann man etwas erreichen, wie:InformationsquelleAutor der Antwort Fabian Picone
Dadurch erreicht werden kann, ziemlich sauber, mit der form, das Aussehen, die Verwendung der standard -
hidden
Feld theme, dass für die Entität. Ich denke, mit Transformatoren ist wahrscheinlich übertrieben, da versteckte, und wählen Sie Felder geben, die das gleiche format.InformationsquelleAutor der Antwort Ryan