Symfony 2.3 übergabe von benutzerdefinierten Daten zu Rechtsform, mit Wahl oder andere Art
SETUP:
- Haupt-Entität, mit der eine verknüpfte Entität mit ManyToOne-relation.
- Wichtigsten Unternehmen in der formType mit der verknüpften Entität Hinzugefügt.
- Die verknüpfte Entität wird ein großes Objekt mit einer Menge von Feldern und verbundenen Objekten, und sehr langsam zu bekommen.
public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add('relatedEntity', 'entity', array( 'class' => 'ProjectName\RelatedEntityBundle\Entity\RelatedEntity', 'query_builder' => function (EntityRepository $er) { $queryBuilder = $er->createQueryBuilder('relatedEntity'); $queryBuilder->resetDQLPart('select'); $queryBuilder->resetDQLPart('from'); $queryBuilder->select('relatedEntity') ->distinct(true) ->from('ProjectNameRelatedEntityBundle:RelatedEntity', 'relatedEntity'); return $queryBuilder; }, .... .... }
Vorlage:
(relateEntity hat eine __toString()
Funktion definiert, um zu zeigen, seinen Namen).
{{ form_label(form.relatedEntity) }} {{ form_widget(form.relatedEntity) }} {{ form_errors(form.relatedEntity) }}
FRAGEN:
- Die Hauptsache, wie oben gezeigt, werden alle Objekte und geben Sie
zu der Vorlage. Es funktioniert perfekt, aber es ist sehr langsam, da die
related entity-Objekte groß und die Abfrage mehr 10
Sekunden fertig feuchtigkeitsspendende alle Objekt-Daten. - Wie könnte ich auswählen, nur einige Felder aus meinen verbundenen Unternehmen und zeigen Sie Sie in die Vorlage, ohne alle Objekte hydratisiert?
- Ist es möglich, verwenden Sie die Auswahl-option oder eine andere Art statt
die Standard -entity
Art, um nur einige Felder der zugehörigen
Person und zeigen Sie Sie in der Vorlage? - Wie könnte ich das erstellen einer benutzerdefinierten Abfrage hydratisiert, wie ein einfaches array von Schlüssel und Wert, und übergeben Sie dieses array an den formType, der queryBuilder meiner verknüpfte Entität-Feld?
- Endlich, in Fall ist es nicht möglich, um nur einige Felder zu sein
gezeigt in der Vorlage, sollte ich vermeiden, symfony 2 Formen und eine
custom management der verbundenen Unternehmen?
TESTS:
Ich kann nicht scheinen, um die form zu erstellen mit der Typ Auswahl durch übergabe nur eines Arrays zeigen eine selectBox mit der id und dem Namen meiner verwandten Entität in der Vorlage. Ich bekomme immer den gleichen Fehler, der mich fragte, fügt ein array von Person-Objekten in, dass die Wahl option.
Schauen wir uns einige Beispiele an der formType, buildForm Funktion der main-entity:
- FUNKTIONIERT, default Symfony 2 generierten code mit null-Typ:
->add('relatedEntity', null, array('label'=> 'relatedEntity'))
- FUNKTIONIERT, mit 'Einheit' geben und eine einfache queryBuilder:
->add('relatedEntity', 'entity', array( 'class' => 'ProjectName\RelatedEntityBundle\Entity\RelatedEntity', 'query_builder' => function (EntityRepository $er) { $queryBuilder = $er->createQueryBuilder('relatedEntity'); $queryBuilder->resetDQLPart('select'); $queryBuilder->resetDQLPart('from'); $queryBuilder->select('relatedEntity') ->from('ProjectNameRelatedEntityBundle:RelatedEntity', 'relatedEntity'); return $queryBuilder; }, 'property' => 'descripcion' ))
- FUNKTIONIERT NICHT mit 'Wahl' geben Sie mit 'Auswahl' die option übergeben ein array von Werten:
$arrayValues = array('1'=>'name1', '2'=>'name2', '3'=>'name3');
->add('relatedEntity', 'choice', array( 'choices' => $arrayValues, 'multiple' => false, 'label'=> 'relatedEntity' ))
- FUNKTIONIERT NICHT mit 'Einheit' geben Sie mit 'Auswahl' die option übergeben ein array von Werten:
$arrayValues = array('1'=>'name1', '2'=>'name2', '3'=>'name3');
->add('relatedEntity', 'entity', array( 'class' => 'ProjectName\RelatedEntityBundle\Entity\RelatedEntity', 'choices' => $arrayValues , 'multiple' => false, 'label'=> 'relatedEntity' ))
Habe ich auch getestet, versucht zu hacken, die die Entscheidungen Eingang requeriment durch den Bau einer Reihe von objets meiner verbundene Gesellschaft, aber es fragt mich, um weiterhin diejenigen Entitäten, bevor Sie gesendet werden, um die Wahl zu geben.
- Haben Sie versucht, mit einer DataTransformer? Ich nehme an, das problem ist die Entität, die erwartet relatedEntity ein Entity (kein string, also den Namen). Um für diese zu arbeiten, müssen Sie reverseTransform Ihre ausgewählten Wert, z.B.
1
wenn Sie wählen, name1 in ein Unternehmen. Das Kochbuch-Eintrag auf DataTransformers (unter Formulare) soll deutlich machen,. - Ty mahok. Als Sie sagte, es könnte sein Problem sein, allerdings die Umwandlung der Werte wieder in Objekte wird ein sehr langsamer Weg, da brauche ich nur, um zu zeigen, eine selectBox mit dem Wert und Namen in der endgültigen form. Das ist, warum ich vermeiden wollte, mit den zugehörigen entity-Objekt, und übergeben nur eine Zeichenfolge, bei der Wahl der option. Ich dont wirklich wissen, ob es einen anderen Weg, es zu tun, ohne sich mit Objekten, wenn gibt es ähnliche Einrichtungen beteiligt. Ich werde klären, ein wenig mehr die Gründe für die ursprüngliche Frage in meinem Beitrag deutlich zu machen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das problem ist dein form-element, das verlangt, dass seine Inhalte auf eine entity, die eine Instanz der Klasse
ProjectName\RelatedEntityBundle\Entity\RelatedEntity
, aber übergeben Sie ein array als Auswahlmöglichkeiten:Auf der anderen Seite, wenn Sie ein Wahl-element, und fügen Sie das array, das Formular-element wird ein string zurückgegeben, in der Erwägung, dass die Entität, erfordert
relatedEntity
eine Instanz der oben genannten Klasse.So oder so, Sie müssen sicherstellen, dass die Daten, die Sie hinzufügen oder abrufen von element passt Ihre Anforderungen.
Was Sie tun können, ist, dass es eine
choice
-element und entfernen Sie die class-Beschränkung (wie Sie sich bemüht haben). Dann, um sicherzustellen, dass es wird eine entity-Instanz, anstatt eine Zeichenfolge, die Sie verwenden können,Formular-Events. Könnten SieFormEvents::SUBMIT
oderFormEvents::PRE_SUBMIT
zu prüfen, welche Person name ausgewählt wurde, und führen Sie eine Abfrage zum abrufen der entsprechenden Einheit, z.B. so etwas wie: