Partage
  • Partager sur Facebook
  • Partager sur Twitter

Symfony 3

Filtrer un Select dans un formType

    24 janvier 2017 à 17:06:38

    Bonjour, 

    je souhaiterais filtrer un select dans un formulaireType en fonction de l'utilisateur courant .

    quand je créer grâce a un formulaire un nouvel objet : batiment

    je récupère dans ce formulaire une liste a partir dune autre entité "sites" pour renseigner que ce nouveaux bâtiment appartiendra au site choisi

    site1

    site2

    site3

    je voudrais les filtrer pour quelle m'affiche juste les sites appartenant a l'utilisateur courant

    chaque site a bien sur l'id de l'utilisateurs en base : utilisateurs_id

    Voila je suis un peux coincé j'ai essayer plusieurs piste et chercher sur le net:

    j'ai essayer de passer l'id du user dans les paramètre du formulaire du controller sans succès

    j'ai essayer d’intégrer un query builder dans le form type et pareil echec.

    je n'est point réussi a adapter un des cas que j'avais vu, je suis surement passer a coté d'un truc pouvez vous m'aider sil vous plais, merci.

    • Partager sur Facebook
    • Partager sur Twitter
      24 janvier 2017 à 17:58:27

      Est-ce que tu saurais nous montrer la construction de ton formulaire? :)
      • Partager sur Facebook
      • Partager sur Twitter
        24 janvier 2017 à 21:12:31

        forType des bâtiment c'est le champs site qui est en select qui recupère toutes les entité sites
            
        class BatimentsType extends AbstractType
        {
            /**
             * {@inheritdoc}
             */
            public function buildForm(FormBuilderInterface $builder, array $options)
            {
                
                  
        
                $builder
                 ->add('nom')
                 ->add('sites',null,array(
                        'label'=>'Associer au Parc :',     
                    )
                 )
                 ->add('superficie')
                 ->add('description', TextareaType::class, array('attr' => array('class' => 'ckeditor')))
                 ->add('images', null, array('label'=>'Choisisser une image'))
                 ->add('hauteur')
                 ->add('created', DateType::class)    
                 ->    
                ;
            }
            
        controller batiment pour nouveau 
          if($id != null){
                    $em = $this->getDoctrine()->getManager();
                    $userId =  $this->getUser()->getId();
        
                    $batiment = new Batiments();
                    $batiment->setUtilisateurs($this->getUser());
        
                    $form = $this->createForm('Sites\SitesBundle\Form\BatimentsType', $batiment);
                    $form->handleRequest($request);
        
                    if ($form->isSubmitted() && $form->isValid()) {
        
                        $em = $this->getDoctrine()->getManager();
        
                        $em->persist($batiment);
                        $em->flush($batiment);
                        return $this->redirectToRoute('batiments_show', array('id' => $batiment->getId()));
                    }
                    $sites = $em->getRepository('SitesBundle:Sites')->find($id);
                    return $this->render('SitesBundle:Default:batiment/layout/new.html.twig', array(
                        'batiment' => $batiment,    
                        'sites'  =>  $sites, 
                        'form' => $form->createView(),
                        ));
        • Partager sur Facebook
        • Partager sur Twitter
          25 janvier 2017 à 9:20:39

          Essaye quelque chose du genre :

          ->add("sites", EntityType::class, array(
                          "class"       => "AppBundle\\Entity\\Site",
                          "choice_label"  => function (Site $site) {
                              return $site->getCode()." - ".$site->getName();
                          },
                          "choice_value"  => "id",
                          "label"         => "Sites",
                          "query_builder" => function (SiteRepository $repository) use ($idUser){
                              return $repository->getSiteByUser($idUser);
                          },

          Il faut évidemment que tu ajoutes la méthode dans ton "SiteRepository" en faisant attention à bien renvoyer un QueryBuilder et non pas une liste d'éléments! :)

          • Partager sur Facebook
          • Partager sur Twitter
            25 janvier 2017 à 9:36:25

            merci je vais essayer ça je te dis si sa marche!!

             $userId = $this->getUser()->getId();

            	public function getSitesByUser($userId)
            	{
            		$qb = $this
            		->createQueryBuilder('u')
            		->select('u')
            		->where('u.utilisateurs =  $idUser' );
            
            
            		return $qb->getQuery()->getResult();
            	}

            c'est mon query builder dis moi si ça te parait correct ?

            j'ai un soucis dans le form pour la variable $userId

            je ne sais pas la récupérer il me dit variable indéfinis, je pense qui faux la passer par le controller bâtiment dans les paramètre de construction du form et c'est la que je bug!

            peut être peut-on faire autrement?

            namespace Sites\SitesBundle\Form;
            
            use Symfony\Bundle\FrameworkBundle\Controller\Controller;
            use Symfony\Component\Form\AbstractType;
            use Symfony\Component\Form\FormBuilderInterface;
            use Symfony\Component\OptionsResolver\OptionsResolver;
            use Sites\SitesBundle\Controller\Batiments;
            use Symfony\Component\Form\Extension\Core\Type\TextareaType;
            use Fichiers\FichiersBundle\Form\MediaType;
            use Symfony\Component\Form\Extension\Core\Type\TextType;
            use Symfony\Component\Form\Extension\Core\Type\DateType;
            use Symfony\Component\Form\Extension\Core\Type\SubmitType;
            use Symfony\Component\Form\Extension\Core\Type\EmailType;
            use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
            use Symfony\Component\Form\Extension\Core\Type\EntityType;
            use Symfony\Component\HttpFoundation\Request;
            
            use Sites\SitesBundle\Repository\Sites;
            use Sites\SitesBundle\Entity\Sites;
            
            class BatimentsType extends AbstractType
            {
                
                /**
                 * {@inheritdoc}
                 */
                public function buildForm(FormBuilderInterface $builder, array $options)
                {
            
                    public $userId;
                    
                    $builder
                    ->add('nom')
                    ->add('sites', EntityType::class, 
                        array(
                            "class"       => "SitesBundle\Entity\Sites",
                            "choice_label"  => function (Sites $sites) {
                                return $sites->getNom()." - ".$sites->getId();
                            },
                            "choice_value"  => "id",
                            "label"         => "Sites",
                            "query_builder" => function (SitesRepository $repository) use ($userId) {
                                return $repository->getSitesByUser($userId);
                            },
                            )
                        )
                    ->add('superficie')
                    ->add('description', TextareaType::class, array('attr' => array('class' => 'ckeditor')))
                    ->add('images', null, array('label'=>'Choisisser une image'))
                    ->add('hauteur')
                    ->add('created', DateType::class)    
            
                    ;
                }
                
                /**
                 * {@inheritdoc}
                 */
                public function configureOptions(OptionsResolver $resolver)
                {
                    $resolver->setDefaults(array(
                        'data_class' => 'Sites\SitesBundle\Entity\Batiments'
                        ));
                }
            
                /**
                 * {@inheritdoc}
                 */
                public function getBlockPrefix()
                {
                    return 'sites_sitesbundle_batiments';
                }
            
            
            }
            

            -
            Edité par FlorentAlandete 25 janvier 2017 à 10:21:16

            • Partager sur Facebook
            • Partager sur Twitter
              25 janvier 2017 à 11:58:43

              Bonjour,

              Je viens de commencer le tuto de Symphony. :)
              Je rencontre un petit problème. Tout a fonctionné pour la génération du Blundle, mais lorsque j'essaye de voir mon Hello "Mon nom", j'ai une page d'exception en mode dev qui s'affiche :

              No route found for "GET /hello/jeremiefabre"
              404 Not Found - NotFoundHttpException
              1 linked Exception: ResourceNotFoundException »

              Je pense que ce doit être un erreur bête, mais bon je la vois pas. ^^

              Merci de votre aide !
              • Partager sur Facebook
              • Partager sur Twitter
              mister-king
                25 janvier 2017 à 13:27:53

                c'est bon j'ai reussi je vous poste mon code pour ce qui auront besoins:

                Le formType

                use Symfony\Component\Form\FormBuilderInterface;
                use Symfony\Component\OptionsResolver\OptionsResolver;
                use Symfony\Component\Form\Extension\Core\Type\TextareaType;
                use Symfony\Component\Form\Extension\Core\Type\TextType;
                use Symfony\Component\Form\Extension\Core\Type\DateType;
                use Symfony\Component\Form\Extension\Core\Type\SubmitType;
                use Symfony\Component\Form\Extension\Core\Type\EmailType;
                use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
                use Symfony\Bridge\Doctrine\Form\Type\EntityType;
                use Symfony\Component\HttpFoundation\Request;
                
                use Fichiers\FichiersBundle\Form\MediaType;
                use Sites\SitesBundle\Repository\SitesRepository;
                
                class BatimentsType extends AbstractType
                {
                    
                    /**
                     * {@inheritdoc}
                     */
                    public function buildForm(FormBuilderInterface $builder, array $options)
                    {
                
                        $userId = $options['userId'];
                      
                        $builder
                        ->add('nom')
                        ->add('sites', EntityType::class, 
                            array(
                                'class'=>'SitesBundle:Sites',
                                "choice_label"  => 'nom',
                                "choice_value"  => "id",
                                "label"         => "Assigner au parc:",
                                "query_builder" => function(SitesRepository $r) use ($userId) {
                                    return $r->getSitesByUser($userId);
                                }
                                )
                        )
                        ->add('superficie')
                        ->add('description', TextareaType::class, array('attr' => array('class' => 'ckeditor')))
                        ->add('images', null, array('label'=>'Choisisser une image'))
                        ->add('hauteur')
                        ->add('created', DateType::class)    
                
                        ;
                    }
                    
                    /**
                     * {@inheritdoc}
                     */
                    public function configureOptions(OptionsResolver $resolver)
                    {
                        $resolver->setDefaults(array(
                            'data_class' => 'Sites\SitesBundle\Entity\Batiments'
                            ));
                        $resolver->setRequired(['userId']);
                        
                    }
                
                    /**
                     * {@inheritdoc}
                     */
                    public function getBlockPrefix()
                    {
                        return 'sites_sitesbundle_batiments';
                    }
                
                
                }
                

                Le querry dans le repository 

                <?php
                
                namespace Sites\SitesBundle\Repository;
                
                /**
                 * SiteRepository
                 *
                 * This class was generated by the Doctrine ORM. Add your own custom
                 * repository methods below.
                 */
                class SitesRepository extends \Doctrine\ORM\EntityRepository
                {
                
                
                	public function getSitesByUser($userId)
                	{
                		
                
                		$qb = $this
                		->createQueryBuilder('u')
                		->select('i')
                		->from('SitesBundle:Sites', 'i')
                		->where('i.utilisateurs =  :userId' )
                		->setParameter('userId', $userId)
                		;
                
                
                		return $qb;
                	}
                	
                	
                
                }
                

                Et le controller

                  public function newAction(Request $request, $id = null)
                    {
                
                
                        if($id != null){
                            $em = $this->getDoctrine()->getManager();
                            $userId =  $this->getUser()->getId();
                
                            $batiment = new Batiments();
                            $batiment->setUtilisateurs($this->getUser());
                
                            $options = array('userId' => $userId);
                
                            $form = $this->createForm(BatimentsType::class, $batiment, $options);
                            $form->handleRequest($request);
                
                            if ($form->isSubmitted() && $form->isValid()) {
                
                                $em = $this->getDoctrine()->getManager();
                
                                $em->persist($batiment);
                                $em->flush($batiment);
                                return $this->redirectToRoute('batiments_show', array('id' => $batiment->getId()));
                            }
                            $sites = $em->getRepository('SitesBundle:Sites')->find($id);
                            return $this->render('SitesBundle:Default:batiment/layout/new.html.twig', array(
                                'batiment' => $batiment,    
                                'sites'  =>  $sites, 
                                'form' => $form->createView(),
                                ));
                
                        }else{
                
                            $em = $this->getDoctrine()->getManager();
                            $userId =  $this->getUser()->getId();
                
                            $options = array('userId' => $userId);
                
                            $batiment = new Batiments();
                            $batiment->setUtilisateurs($this->getUser());
                            $form = $this->createForm(BatimentsType::class, $batiment, $options);
                            $form->handleRequest($request);
                
                            if ($form->isSubmitted() && $form->isValid()) {
                
                                $em = $this->getDoctrine()->getManager();
                
                                $em->persist($batiment);
                                $em->flush($batiment);
                                return $this->redirectToRoute('batiments_show', array('id' => $batiment->getId()));
                            }
                
                            return $this->render('SitesBundle:Default:batiment/layout/new.html.twig', array(
                                'batiment' => $batiment,  
                                'form' => $form->createView(),
                                ));
                        }
                
                        
                
                    }

                Merci Whouki tu m'as mis sur la voie j'avais des problème dans ma query et de chemin de use pour le EntityType qui ne se trouve pas au même endroit que les autre!!!!!

                Salut Mohamadou je pense qu'il faux que tu crées une route dans Ressources/config/routing | /routing.yml de ton bundle.

                nom_route:
                    path:     /hello/jeremiefabre
                    defaults: { _controller: "TonBundle:ControllerName:index" }
                

                ou

                et tu injecte le nom que tu rentre dans ton url a l'action index de ton controller.

                nom_route:
                    path:     /hello/{nom}
                    defaults: { _controller: "TonBundle:ControllerName:index" }



                • Partager sur Facebook
                • Partager sur Twitter

                Symfony 3

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                • Editeur
                • Markdown