====== Trier les lignes d'un EntityType ====== J'ai eu un cas où les chaînes affichées dans un champ **EntityType** provenaient d'une fonction de l'entité qui renvoyait une chaîne de caractères. Cela rendait impossible le tri des résultats au niveau de la requête en base de données. Dans ce cas, on laisse le champ tel quel et on va le trier juste avant que le formulaire ne soit rendu, dans la fonction **finishView**. Dans l'exemple ci-dessous, l'entité **App\Entity\Category** dispose d'une fonction **getDisplayString()** qui concatène les titres de toutes les catégories parentes depuis le premier niveau jusqu'à la catégorie fille. Le champ affiche donc la propriété ''display_string'', et le tri du champ se fait dans la fonction **finishView**. ^ Ne pas oublier d'ajouter les **use** : ^ | use Symfony\Component\Form\ChoiceList\View\ChoiceView | | use Symfony\Component\Form\FormInterface | | use Symfony\Component\Form\FormView | namespace App\Form; use App\Entity\Category; use Symfony\Bridge\Doctrine\Form\Type\EntityType; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\ChoiceList\View\ChoiceView; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\Form\FormInterface; use Symfony\Component\Form\FormView; use Symfony\Component\OptionsResolver\OptionsResolver; class MonFormulaireType extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add('categorie', EntityType::class, [ 'label' => 'Catégorie', 'class' => Category::class, 'choice_label' => 'display_string' ) // ... ; } public function finishView(FormView $view, FormInterface $form, array $options) { // Trier les options du champ 'categorie' selon leur 'label' usort( $view->children['categorie']->vars['choices'], function(ChoiceView $a, ChoiceView $b) { return strcasecmp( $a->label, $b->label ); } ); } public function configureOptions(OptionsResolver $resolver) { $resolver->setDefaults([ 'data_class' => Category::class, ]); } }