Outils pour utilisateurs

Outils du site


symfony3:formulaires

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:

<div class="well">
  {{ form_start(form, {'attr': {'class': 'form-horizontal'}}) }}
  {{ form_errors(form) }}
 
  <div class="form-group">
    {{ form_errors(form.nom) }}
    <div class="col-sm-8">
      {{ form_widget(form.nom, {'attr': {'class': 'form-control'}}) }}
    </div>
  </div>
 
  <div class="form-group">
    <div class="col-sm-8">
      {{ form_widget(form.enregistrer, {'attr': {'class': 'btn btn-primary'}}) }}
    </div>
  </div>
 
  {{ form_rest(form) }}
  {{ form_end(form) }}
</div>

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.

symfony3/formulaires.txt · Dernière modification: 2019/06/22 06:49 par marclebrun