2016-07-19 3 views
0

Ich habe das folgende Formular. Sowohl für device als auch parts möchte ich Symfony unterdrücken, das alle Wahlen in den HTML lädt, wie ich bereits einen Select2 Haken verwende, um die Wahlen durch Ajax zu laden, und das Hinzufügen von Wahlen fügt viel Aufblähen hinzu (es gibt über 4000 Teile).Symfony Select2 auf EntityType: Laden Sie nicht alle Auswahlmöglichkeiten in HTML

Was soll ich tun? Ich habe versucht, 'choices' => array() hinzufügen, die in der Tat eine leere Liste dient, führt zu einem ungültigen Formular, da dies bedeutet, dass es keine gültigen verfügbaren Möglichkeiten gibt.

<?php 
public function buildForm(FormBuilderInterface $builder, array $options) { 
    $builder 
     ->add('device', EntityType::class, array('label' => 'Toestel', 'class' => 'AppBundle:Device', 'choice_label' => function($device) { 
       return $device->getBrand()->getName().' '.$device->getName(); 
     })) 
     ->add('parts', EntityType::class, array('label' => 'Onderdelen', 'class' => 'AppBundle:Part', 'choice_label' => 'name', 'multiple' => true)) 
     ->getForm(); 
} 
?> 

Antwort

0

Verwenden Sie stattdessen einen Querybuilder. Dies zeigt Ihnen ein gutes Beispiel:

http://symfony.com/doc/current/reference/forms/types/entity.html#using-a-custom-query-for-the-entities

Ich denke, man es herausfinden kann aus den obigen Link aus ...

OK EDIT # 2 nach Ihre Kommentare:

Versuchen Sie es mit die Option 'Optionen' unten gezeigt:

public function buildForm(FormBuilderInterface $builder, array $options) { 
    $builder 
     ->add('device', EntityType::class, array(
       'label' => 'Toestel', 
       'class' => 'AppBundle:Device', 
       'choices' => $device->getBrand()->getName().' '.$device->getName(), 
     })) 
     ->add('parts', EntityType::class, array(
       'label' => 'Onderdelen', 
       'class' => 'AppBundle:Part', 
       'choice_label' => 'name', 
       'multiple' => true)) 
     ->getForm(); 
} 

Nicht sicher, dass dies für Sie funktioniert, aber es könnte. Die Variable $device muss als Formularoption übergeben werden oder an einer anderen Stelle als Variable, die das Objekt AppBundle: Device darstellt.

Versuchen Sie dies und sehen Sie, ob es für Sie funktioniert!

Bearbeiten # 3: Basierend auf Ihren Kommentaren. Ich verstehe, was Sie meinen, wenn Sie mit AJAX laden. Was benutzt du? Vielleicht "aufladen" für den Körper? Sie zeigen den Code nicht an.

Vielleicht ist die beste Lösung dann jedoch ein ChoiceType mit einem leeren Array. Wenn das leere Array nicht funktioniert, versuchen Sie, etwas hineinzulegen.

Versuchen Sie diese Vorschläge. Ich habe es nur für das 'Gerät' Drop-Down-Liste, da ich bin nicht sicher, welche (s) benötigen Sie es für:

Null-Array:

public function buildForm(FormBuilderInterface $builder, array $options) { 
    $builder 
     ->add('device', ChoiceType::class, array(
       'label' => 'Toestel', 
       'choices' => array(
          //null 
        ), 
     })) 
     ->add('parts', EntityType::class, array(
       'label' => 'Onderdelen', 
       'class' => 'AppBundle:Part', 
       'choice_label' => 'name', 
       'multiple' => true)) 
     ->getForm(); 
} 

Array mit Müll drin:

public function buildForm(FormBuilderInterface $builder, array $options) { 
    $builder 
     ->add('device', ChoiceType::class, array(
       'label' => 'Toestel', 
       'choices' => array(
          'Something' => true, 
        ), 
     })) 
     ->add('parts', EntityType::class, array(
       'label' => 'Onderdelen', 
       'class' => 'AppBundle:Part', 
       'choice_label' => 'name', 
       'multiple' => true)) 
     ->getForm(); 
} 

Probieren Sie sie aus!

+0

Danke, Alvin, aber ich bin mir nicht sicher, was im Beispiel passiert; es ist relativ schlecht dokumentiert. Wie stelle ich sicher, dass überhaupt nichts als Auswahl übergeben wird, während es jedem Wert erlaubt ist, eine gültige Wahl zu sein? – bluppfisk

+0

Ich habe meinen Beitrag basierend auf deinen Kommentaren bearbeitet. Schau dir den Blippfisk an. –

+0

Hm, das ist nicht genau das, was ich will. Ich möchte, dass es überhaupt keine Wahlmöglichkeiten gibt. Wenn Sie für "Optionen" keinen Wert angeben, werden automatisch alle Gerätenamen in die Auswahloption geladen. Wenn Sie dies tun, wird auch das * jeder Wahl geladen. Dann wird es in meinem Fall 4000

0

Eine Lösung gefunden. Es ist nicht hervorragend, aber es schlägt das Laden von mehr als 4000 HTML-Options-Tags.

Es war schwieriger als ich denke, es hätte sein sollen, aber mit dem elsässischen/form-Bundle, es funktioniert gut. Lesen Sie More info on alsatian/form-bundle vom Programmierer selbst.

Sie werden es jedoch ein wenig zwicken wollen, vor allem, wenn Sie nicht MongoDB verwenden. Z.B. im Bündel des services.yml Ich hatte zu äußern:

- [setDocumentManager,["@doctrine.odm.mongodb.document_manager"]]

Und, um es selbst zu installieren, Sie minimum-stability in Komponisten gesetzt haben.Json zu dev - und um alles andere nicht zu brechen, sollten Sie auch prefer-stable auf true setzen.

, damit es auf meinem MySQL-Setup funktioniert. Ansonsten ist es auch nicht sehr gut, Optionen für das Select2-Element einzustellen. Ich war in der Lage, AbstractRoutableType.php ein bisschen zu zwicken, so könnte es auch verschiedene Anfrage-Methoden, aber es gibt keine erweiterte Datenanalyse, da Sie JavaScript dafür benötigen würde (ich glaube nicht, HTML data- Eigenschaften können Funktionen vermitteln).

Also am Ende habe ich noch alle diese Optionen in meiner Twig-Datei zwischen <script> Tags konfiguriert.

Verwandte Themen