Outils pour utilisateurs

Outils du site


symfony4:formulaires_trier_les_lignes_dun_entitytype

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
MonFormulaireType
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,
        ]);
    }
 
}
symfony4/formulaires_trier_les_lignes_dun_entitytype.txt · Dernière modification: 2020/04/17 17:02 (modification externe)