Bonjour à tous!

J'ai une relation ManyToMany DomainNames avec les utilisateurs Users.
Je souhaite afficher un formulaire en select qui correspond aux catégories en fonction de l'utilisateur connecté. Cela me permet donc de sélectionner un seul DomainName pour pouvoir afficher toutes ses infos.

#[Route('/project2', name: 'app_project_progress', methods: ['GET', 'POST'])]
    public function list(
        Request $request,
        DomainNameRepository $domainNameRepository,
        UserRepository $userRepository,
    ): Response {

        $id = $this->getUser()->getId();
        $domainNames = $domainNameRepository->findByUserId($id);
        dd($domainNames);
        $form = $this->createForm(DomainNamesListType::class, $domainNames);

    return $this->render('project_progress/project-progress.html.twig', [
            'form' => $form->createView(),
        ]);
    }

J'arrive à récupérer un array des 2 DomainName qui correspondent à l'utilisateur connecté, en utilisant dd($domainNames);

ProjectProgressController.php on line 49:
array:2 [▼
  0 => App\Entity\DomainName {#745 ▶}
  1 => App\Entity\DomainName {#781 ▶}
]

Voici la classe DomainNamesListType pour servir de modèle au formulaire :

 public function buildForm(FormBuilderInterface $builder, array $options): void
    {
        $builder
            ->add('domainNames', EntityType::class, [
                'attr' => [
                    'class' => 'form-select',
                ],
                'label' => 'Nom de domaine',
                'class' => DomainName::class,
                'choice_label' => 'name',
            ])
            ->add('submit', SubmitType::class, [
                'attr' => [
                    'class' => 'btn btn-primary'
                ],
                'label' => 'Valider'
            ])
        ;

Le problème est que le template dans laquelle je veux afficher le 'form' renvoie la liste complète des DomainName pour tous les utilisateurs, et non pas la liste courte pour le seul utilisateur connecté.

<div>
    {{ form(form)}}
</div>

Merci pour votre aide !

1 réponse


olic
Auteur

Je reponds à moi-même lol

Primo : il faut un query_builder dans EntityType
Donc voici mon DomainNameFormType :

class DomainNamesFormType extends AbstractType
{
    private $security;

    public function __construct(Security $security)
{
    $this->security = $security;
}
    public function buildForm(FormBuilderInterface $builder, array $options): void
    {
        $user = $this->security->getUser();

        $builder
            ->add('submit', SubmitType::class, [
                    'attr' => [
                        'class' => 'btn btn-primary'
                    ],
                    'label' => 'Valider'
            ])
            ->add('domainName', EntityType::class, array(
                    'class' => DomainName::class,
                    'choice_label' => 'name',
                    'query_builder' => function (DomainNameRepository $domainNameRepository) use ($user) {
                        return $domainNameRepository->findDomainNames($user->getId());
                    },
                    'label' => 'Attribuer un utilisateur au projet : ',
                ));
            }
}

Et autre curiosité de PHP / Symfony, il faut dégager 2 lignes (que j'ai gardées en commentaire) dans la fonction FindDomaineNames() du DomainNameRepository :

    public function findDomainNames($user_id): querybuilder
    {
        $qb = $this->createQueryBuilder('d')
            ->innerJoin('d.users', 'user')
            ->andWhere('user.id = :val')
            ->setParameter('val', $user_id)
            ->orderBy('d.id', 'ASC')
            ->setMaxResults(10)
//            ->getQuery()
//            ->getResult()
            ;
        return $qb;
    }

Si vous gardez getQuery et getResult, le résultat sera un array alors que c'est un querybuilder qui est attendu.

Voilà, bien content d'avoir enfin trouvé, on peut clore le sujet!