====== Formulaires ====== ===== Formulaire basé sur une entité Doctrine ===== Pour une entité nommée **MonEntite** dans un bundle nommé **ML/MonBundle** : bin/console doctrine:generate:form MLMonBundle:MonEntite Cette commande crée une classe **MonEntiteType** définie dans le fichier **src/ML/MonBundle/Form/MonEntiteType.php** Il est conseillé d'ajouter les types et les options à chaque champ de formulaire ajouté dans cette classe, ainsi que retirer les champs en trop et ajouter les champs manquants (bouton submit, …). Pour créer un formulaire à partir de cette classe dans le code d'un formulaire: namespace ML\MonBundle\Controller; use Symfony\Bundle\FrameworkBundle\Controller\Controller; use Symfony\Component\HttpFoundation\Request; use ML\MonBundle\Entity\MonEntite; use ML\MonBundle\Form\MonEntiteType; class MonController extends Controller { public function addAction(Request $request) { $monEntite = new MonEntite; $form = $this->get('form.factory') ->create(MonEntiteType::class, $monEntite); if($request->isMethod('POST') && $form->handleRequest($request)->isValid()) { $em = $this->getDoctrine()->getManager(); $em->persist($advert); $em->flush(); $request->getSession()->getFlashBag()->add('notice', 'Données enregistrées.'); return $this->redirectToRoute('ml_monbundle_view', ['id' => $monEntite->getId()]); } return $this->render('MLMonBundle:MonController:add.html.twig', [ 'form' => $form->createView(), ]); } } La ligne de création du formulaire (avec 'form.factory') peut être raccourcie : $form = $this->createForm(MonEntiteType::class, $monEntite); ===== Formulaire basé sur n'importe quelle classe ===== Exemple dans avec une classe **Personne** : use Symfony\Component\Form\Extension\Core\Type\FormType; use Symfony\Component\Form\Extension\Core\Type\TextType; use Symfony\Component\Form\Extension\Core\Type\SubmitType; use MonBundle\MesClasses\Personne; public function indexAction() { $personne = new Personne(); $formBuilder = $this->get('form.factory') ->createBuilder(FormType::class, $personne); $formBuilder ->add('nom', TextType::class) ->add('prenom', TextType::class) ->add('enregistrer', SubmitType::class); $form = $formBuilder->getForm(); return $this->render('MonBundle:Personnes:index.html.twig', [ 'form' => $form->createView(), ]); } ===== Rendu des formulaires avec TWIG ===== Lors de l'appel de **$this->render** dans le contrôleur, on passe le formulaire sous forme de variable nommée **'form'**. C'est sous ce nom que l'on va y faire référence dans le template. Sous sa forme la plus simple, le formulaire est rendu de cette façon : {{ form(form) }} Mais on ne contrôle absolument pas la façon dont l'affichage est fait. Pour maîtriser comment chaque partie du formulaire sera rendue, il faut l'éclater en ses différentes parties dans notre template. Par exemple, en utilisation la librairie CSS Bootstrap:
{{ form_start(form, {'attr': {'class': 'form-horizontal'}}) }} {{ form_errors(form) }}
{{ form_errors(form.nom) }}
{{ form_widget(form.nom, {'attr': {'class': 'form-control'}}) }}
{{ form_widget(form.enregistrer, {'attr': {'class': 'btn btn-primary'}}) }}
{{ form_rest(form) }} {{ form_end(form) }}
===== Note sur l'intégration de Bootstrap ===== Dans **app/config/config.yml** il faut ajouter une ligne dans la section **twig** : # Twig Configuration twig: ... form_themes: - 'bootstrap_3_layout.html.twig' Le template **bootstrap_3_layout.html.twig** est inclus dans Symfony et définit le rendu d'un formulaire adapté à la librairie CSS Bootstrap 3.