Partage
  • Partager sur Facebook
  • Partager sur Twitter

Symfony - FormType, query_builder et paramètre

    16 janvier 2018 à 11:04:14

    Bonjour, 

    je cherche à créer un formulaire dont l'un des champs affiche uniquement l'objet sélectionné par l'utilisateur auparavant. Pour mieux comprendre :

    je souhaite gérer un inventaire d'école (type bibliothèque). Dans cet inventaire il y a des documents que les enseignants peuvent emprunter. L'enseignant peut sélectionner un document à emprunter puis il accède à un formulaire lui permettant d'emprunter le document (date d'emprunt, date de retour...). J'ai donc créé une entité 'Emprunter', une entité 'Document'...

    En cliquant sur le document souhaité, l'id du document est récupéré dans le controller (via l'url) : 

    Dans la vue: 

    <td><a href="{{ path('ecole_inventaire_ajout', {'id': dp.document.id}) }}"><input type="button"></a></td>

    Dans le EmprunterType:

    public function buildForm(FormBuilderInterface $builder, array $options)
        {
            
        $builder->add('dateEmprunt', DateType::class)->add('Personne', PersonneType::class)->add('Document', EntityType::class, array(
        'class'        => 'EcoleInventaireBundle:Document',
        'choice_label' => 'docTitre',
        'multiple'     => false,
        'query_builder' => function(DocumentRepository $repository) use($id) {
              return $repository->getDocIdQueryBuilder($id);
          }
    
        ))->add('save', SubmitType::class)->getForm();
        }



    Dans le DocumentRepository:

    	public function getDocIdQueryBuilder($id)
    	{
    		return $this
    		->createQueryBuilder('docId')
    		->where('docId.id = :id')
    		->setParameter('id', $id);
    	}
    
    	



    Dans le Controller : 

    public function addEmprunterAction(Request $request){
    		$id=$request->query->get('id');
    		$emprunt=new Emprunter();
    		$form=$this->get('form.factory')->create(EmprunterType::class, $emprunt);
    
    		if ($request->isMethod('POST') && $form->handleRequest($request)->isValid()) {
    			$em = $this->getDoctrine()->getManager();
    			$em->persist($emprunt);
    			$em->flush();
    
    			return $this->redirectToRoute('ecole_site_home');
    		}
    
    		return $this->render('EcoleInventaireBundle:InventaireDocPed:addInventaireDocPed.html.twig', array(
    	   'id'=> $id,
           'form' => $form->createView(),
    
            ));
    
    	}



    Bien sût, l'erreur concerne la varible $id qu'il ne reconnaît pas dans la closure d'EmprunterType. Seulement je ne parviens pas à régler ce problème, quelqu'un pourrait-il me guider? Je précise que je débute Symfony et je suis en pleine phase de compréhension du framework :). Merci beaucoup. 

    -
    Edité par michca10 16 janvier 2018 à 11:14:12

    • Partager sur Facebook
    • Partager sur Twitter
      16 janvier 2018 à 13:19:20

      Tu peux passer ton $id à ta fonction addEmprunterAction

      public function addEmprunterAction($id, Request $request)


      Tu devras changer la route vers addEmprunterAction dans routing.yml.

      Quelque chose du genre

      ecole_inventaire_ajout:
          path: /inventaire_ajout/{id}
          defaults: { _controller: AppBundle:Default:addEmprunter }

      A adapter selon ton code bien entendu



      -
      Edité par HarvestR 16 janvier 2018 à 13:29:14

      • Partager sur Facebook
      • Partager sur Twitter

      Symfony - FormType, query_builder et paramètre

      × 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