2 votes

Symfony Select2 sur EntityType : ne pas charger tous les choix en HTML

J'ai le formulaire suivant. Les deux pour device y parts Je veux supprimer le chargement par Symfony de tous les choix dans le HTML, car j'utilise déjà un crochet Select2 pour charger les choix par Ajax, et l'ajout de choix ajoute beaucoup d'éléments (il y a plus de 4000 éléments).

Que dois-je faire ? J'ai essayé d'ajouter 'choices' => array() qui sert effectivement une liste vide, mais donne lieu à un formulaire invalide, car cela signifie qu'il n'y a pas de choix valides disponibles.

<?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();
}
?>

0voto

Alvin Bunk Points 6018

Utilisez plutôt un générateur de requêtes. Vous trouverez ici un bon exemple :

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

Je pense que vous pouvez le comprendre à partir du lien ci-dessus...

OK EDIT #2 selon vos commentaires :

Essayez d'utiliser l'option "choix" présentée ci-dessous :

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();
}

Je ne suis pas certain que cela vous convienne, mais c'est possible. La variable $device doit être passé dans les options du formulaire, ou ailleurs comme une variable qui représente l'objet AppBundle:Device.

Essayez ceci et voyez si cela fonctionne pour vous !

Edit #3 : Sur la base de vos commentaires. Je comprends ce que vous voulez dire par chargement avec AJAX. Qu'est-ce que vous utilisez ? Peut-être 'onload' pour le corps ? Vous ne montrez pas le code.

Cependant, la meilleure solution est peut-être un type de choix avec un tableau vide. Si le tableau vide ne fonctionne pas, essayez d'y mettre quelque chose.

Essayez ces suggestions. Je ne l'ai fait que pour la liste déroulante des "périphériques", car je ne sais pas exactement pour lesquels vous en avez besoin :

Tableau nul :

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();
}

Un tableau avec des déchets dedans :

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();
}

Essayez-les !

0voto

bluppfisk Points 542

J'ai trouvé une sorte de solution. Elle n'est pas excellente mais c'est mieux que de charger plus de 4000 balises d'option HTML.

C'était plus difficile que prévu, mais avec le pack alsacien/forme, ça marche bien. Lire Plus d'informations sur alsatian/form-bundle de la part du codeur lui-même.

Vous devrez cependant le modifier un peu, surtout si vous n'utilisez pas MongoDB. Par exemple, dans le paquet de données services.yml J'ai dû faire un commentaire :

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

Et pour pouvoir l'installer, vous devez définir minimum-stability dans composer.json pour dev - et afin de ne pas casser tout le reste, vous devez aussi mettre prefer-stable à true .

pour qu'il fonctionne sur mon installation MySQL. Sinon, il n'est pas non plus très bon pour définir les options de l'élément Select2. J'ai pu modifier AbstractRoutableType.php afin qu'il puisse également prendre en charge différentes méthodes de requête, mais il n'y a pas d'analyse avancée des données car vous auriez besoin de JavaScript pour cela (je ne pense pas que HTML data- les propriétés peuvent véhiculer des fonctions).

Donc, au final, j'ai toujours toutes ces options configurées dans mon fichier Twig, entre <script> tags.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X