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 variable $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.

1 réponse


Il faudra ajouter l'option id dans ton EmprunterType puis passer l'id du document lors de la creation de ton formulaire dans le controller.

Dans le EmprunterType:

public function buildForm(FormBuilderInterface $builder, array $options)
{

      $id = $options['id'];
      $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);
}

/**
* Configuration de ton formulaire
*/
public function configureOptions(\Symfony\Component\OptionsResolver\OptionsResolver $resolver)
{       
        // Tu specificies a ton formulaire que l'option id est obligatoire lors de la creation du formulaire.
        $resolver->setRequired('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, ['id' => $id]);
    ....
}