Salut la communauté, voici mon problème:
j'ai une entité matiere et une entité compétence. une l'entité compétence est en relation ManyToOne avec matière. une matière contient plusieurs compétences. J'ai aussi ajouter une rélation les entités matiere et competence et utilisateur afin que chaque utilisateur n'ait assez qu'aux matieres qu'il créé. Le problème se situe au niveau de la création d'une compétence. lorsque je veux choisir matiere dans le select, tous les matiere s'affiche, j'ai pensé créé un querybuilder dans le champ select du formulaire. là, il faut recupérer l'utilisateur courant et recupérer uniquement les matiere correspondant à l'id de cet utilisateur. le problème c'est que je ne sais pas comment recuperer l'utilisateur courant dans un formulaire. Une idéé?

CompetenceType

<?php

namespace App\ProfBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Doctrine\ORM\EntityRepository;
use Symfony\Component\DependencyInjection\ContainerInterface as Container;

class CompetenceType extends AbstractType
{

    public function __construct($security_context)
    {
        $this->security = $security_context;
    }
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('nom')
            ->add('statut')
            ->add('matiere', 'entity', array(
                'class' => 'AppProfBundle:Matiere',
                'property' => 'nom',
                'query_builder' => function (EntityRepository $er) {
                    return $er->createQueryBuilder('i')
                        ->where('', '');
                }
            ))
        ;
    }

    /**
     * @param OptionsResolver $resolver
     */
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'App\ProfBundle\Entity\Competence'
        ));
    }
}

4 réponses


nico41
Réponse acceptée

forcement, tu as :

public function __construct($security_context)
{
        $this->security = $security_context;
}

dans ta classe CompetenceType, enlèves le !

De mémoire cela doit être un truc comme ça :

class CompetenceType extends AbstractType
{

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $user = $options['user'];
        $builder
            ->add('nom')
            ->add('statut')
            ->add('matiere', 'entity', array(
                'class' => Matiere::class,
                'property' => 'nom',
                'query_builder' => function (EntityRepository $er) use ($user) {
                    return $er->createQueryBuilder('i')
                        ->andWhere('i.user = :user')->setParameter('user', $user);
                }
            ))
        ;
    }

    /**
     * @param OptionsResolver $resolver
     */
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array('data_class' => Competence::class));
        $resolver->setRequired('user');     //   <= $option requise pour la création du formulaire
        $resolver->setAllowedTypes('user', User::class);  // <= type de l'option
    }
}

// dans controller :

public function monAction(Request $request, ...)
{
    $user = ... ;  

    $competence =  ... ; 
        // ...
    $form = $this->createForm(CompetenceType::class, $competence, ['user'=>$user]); // <= $user passé en option
        $form->handle($request)
        // ... etc
}

Merci pour la réation Nico voilà ce que j'ai fait
CompetenceType

<?php

namespace App\ProfBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Doctrine\ORM\EntityRepository;
use Symfony\Component\DependencyInjection\ContainerInterface as Container;

class CompetenceType extends AbstractType
{

    public function __construct($security_context)
    {
        $this->security = $security_context;
    }
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $user = $options['user'];
        $builder
            ->add('nom')
            ->add('statut')
            ->add('matiere', 'entity', array(
                'class' => 'AppProfBundle:Matiere',
                'property' => 'nom',
                'query_builder' => function (EntityRepository $er) use ($user) {
                    return $er->createQueryBuilder('i')
                        ->andWhere('i.user = :user')->setParameter('user', $user);
                }
            ))
        ;
    }

    /**
     * @param OptionsResolver $resolver
     */
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'App\ProfBundle\Entity\Competence'
        ));
        $resolver->setRequired('user');  
        $resolver->setAllowedTypes('user', 'App\UserBundle\Entity\User');
    }
}

Controller

public function newAction(Request $request)
    {
        $competence = new Competence();
        $user = $this->getUser();
        $competence->setUser($user);
        $form = $this->createForm('App\ProfBundle\Form\CompetenceType', $competence, ['user'=>$user]);
        $form->handleRequest($request);

        if ($form->isSubmitted() && $form->isValid()) {
            $em = $this->getDoctrine()->getManager();
            $em->persist($competence);
            $em->flush();

            return $this->redirectToRoute('competence_index');
        }

        return $this->render('competence/new.html.twig', array(
            'competence' => $competence,
            'form' => $form->createView(),
        ));
    }

j'ai l'erreur

Warning: Missing argument 1 for App\ProfBundle\Form\CompetenceType::__construct(), called in C:\wamp64\www\maena\vendor\symfony\symfony\src\Symfony\Component\Form\FormRegistry.php on line 90 and defined 

Super merci Nico tout marche bien, je crois que je vais te citer dans les remmerciements de mon mémoire. Bon pour le moment, une chose de fait, je passe à l'étape suivante. Exporter les données. je ne sais pas trop comment ca se passe avec symfony mais pour le moement, je marque résolu sur ce post et j'ouvre un nouveau post