5 votes

Symfony EasyAdminBundle : Filtrer les entités dans le champ assotiation

J'ai un formulaire avec un champ de type assotation (liste d'entités liées).

Ce que j'essaie de faire, c'est de filtrer cette liste sur le formulaire "newAction" (création d'une nouvelle entité).

Par exemple, l'écran ci-dessous :

  1. Il existe une entité Enquête avec le champ "Utilisateur".
  2. Il existe une entité Département avec le champ "Survey" (@ORM \ManyToOne ) où l'utilisateur choisit une enquête.

Vous pouvez voir deux enquêtes disponibles mais je ne veux afficher que la première, car la valeur de son champ Utilisateur est la même que celle de l'utilisateur actuel.

enter image description here

C'est déroutant, car je ne trouve pas les valeurs passées au champ Enquête lorsque je débogue.

3voto

Maya Shah Points 640

Le meilleur moyen est de remplacer le contrôleur par défaut et d'appliquer le générateur de requêtes au formulaire comme ceci.

YML:-

easy_admin:
    entities:
        Department:
            class: YourBundle\Entity\Department
            controller: YourBundle\Controller\Admin\Model\DepartmentController

Dans DepartmentController:-

<?php

namespace YourBundle\Controller\Admin\Model;

use Doctrine\ORM\EntityRepository;
use Doctrine\ORM\QueryBuilder;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use JavierEguiluz\Bundle\EasyAdminBundle\Controller\AdminController;

class DepartmentController extends AdminController
{
    public function createDepartmentEntityFormBuilder($entity, $view)
    {
        $formBuilder = parent::createEntityFormBuilder($entity, $view);

        $user = $this->get('security.token_storage')->getToken()->getUser();

        $formBuilder->add('survey', EntityType::class, [
            'class' => 'YourBundle\Entity\Survey',
            'query_builder' => function (EntityRepository $er) {
                return $er->createQueryBuilder('s')
                    ->where('s.user = :user')
                    ->setParameter('user', $user);
            },
        ]);

        return $formBuilder;
    }
}

0voto

rernesto Points 475

Ma solution :

$formBuilder = parent::createEntityFormBuilder($entity, $view);
    if (!$this->get('security.authorization_checker')->isGranted('ROLE_SUPER_ADMIN')) {
        $user = $this->get('security.token_storage')->getToken()->getUser();
        $promoter = $this->getDoctrine()
            ->getRepository(Promoter::class)
            ->findByUser($user);
        $queryBuilder = $this->getDoctrine()
            ->getRepository(Customer::class)
            ->getActiveByPromoterQueryBuilder($promoter);
        $formBuilder->add(
            'customers', EntityType::class, [
                'class' => Customer::class,
                'query_builder' => $queryBuilder,
                "attr" => ["class" => "form-control select2", "data-widget" => "select2"],
                'by_reference' => false,
                'multiple' => true,
                'required' => false
            ]
        );
    }
    return $formBuilder;
}

Selon 'vendor/easycorp/easyadmin-bundle/src/Resources/views/default/includes/_select2_widget.html.twig'. Nous devons seulement ajouter l'attribut data-widget.

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