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:

  1. 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.
  2. Wie könnte ich auswählen, nur einige Felder aus meinen verbundenen Unternehmen und zeigen Sie Sie in die Vorlage, ohne alle Objekte hydratisiert?
  3. 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?
  4. 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?
  5. 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.
InformationsquelleAutor xtrm | 2014-04-01
Schreibe einen Kommentar