Contactez-nous

Intégrer et afficher le formulaire dans un template Twig

Apprenez à instancier un FormType dans un contrôleur Symfony, à le passer à un template Twig, et à utiliser les fonctions Twig `form_start`, `form_widget`, `form_row`, `form_errors`, `form_label`, `form_rest` et `form_end` pour un affichage flexible et pe

Instanciation du formulaire dans le contrôleur

Une fois que vous avez défini votre classe de type de formulaire (par exemple, App\Form\TaskType), la prochaine étape consiste à l'utiliser dans un contrôleur. C'est le contrôleur qui va instancier le formulaire et le passer au template Twig pour affichage. Pour créer un nouveau formulaire, vous utiliserez la méthode createForm() disponible dans les contrôleurs qui étendent AbstractController.

Supposons que nous voulions créer une page pour ajouter une nouvelle tâche. Nous aurons besoin d'une nouvelle action dans notre TaskController et d'une route associée. Appelons cette action newTask() :

namespace App\Controller;

use App\Form\TaskType; // Importez votre classe de type de formulaire
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request; // Nécessaire pour gérer la soumission du formulaire
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;

class TaskController extends AbstractController
{
    // ... autres méthodes (index, show)

    #[Route('/tache/nouvelle', name: 'app_task_create', methods: ['GET', 'POST'])]
    public function newTask(Request $request): Response
    {
        // 1. Les données initiales du formulaire (optionnel)
        // Si c'est un formulaire de création, cela peut être un tableau vide
        // ou une nouvelle instance de votre entité (si vous utilisez Doctrine).
        $initialData = []; // Pour notre exemple sans entité Doctrine
        // Si vous aviez une entité Task : $task = new Task(); $initialData = $task;

        // 2. Création de l'instance du formulaire
        // Le premier argument est la classe de votre FormType.
        // Le second argument (optionnel) sont les données initiales.
        $form = $this->createForm(TaskType::class, $initialData);

        // 3. Gestion de la soumission (sera détaillé dans une section ultérieure)
        // $form->handleRequest($request);
        // if ($form->isSubmitted() && $form->isValid()) { ... }

        // 4. Passer la "vue" du formulaire au template
        // Il est crucial d'appeler createView() sur l'objet formulaire.
        return $this->render('task/new.html.twig', [
            'taskForm' => $form->createView(),
            // 'taskForm' => $form, // Passer $form directement fonctionne aussi dans les versions récentes
        ]);
    }
}

Dans cet extrait :

  • Nous importons App\Form\TaskType.
  • $initialData est un tableau vide car nous créons une nouvelle tâche. Si nous éditions une tâche existante, nous passerions l'objet ou le tableau de cette tâche ici pour pré-remplir le formulaire.
  • $this->createForm(TaskType::class, $initialData) instancie notre formulaire.
  • $form->createView() crée une représentation spéciale du formulaire, appelée "vue de formulaire" (FormView), qui est ensuite passée au template Twig. C'est cet objet FormView que Twig utilisera pour afficher les différents éléments du formulaire. Dans les versions plus récentes de Symfony, passer directement l'objet $form fonctionne également, car Symfony et Twig peuvent en déduire la vue. Cependant, l'utilisation explicite de createView() est une pratique bien établie.

Affichage du formulaire dans le template Twig avec les fonctions dédiées

Maintenant que notre contrôleur passe la vue du formulaire au template, nous devons créer ou modifier le template Twig pour afficher ce formulaire. Créons un nouveau fichier templates/task/new.html.twig.

Twig offre un ensemble de fonctions très pratiques pour afficher les formulaires de manière flexible. Les plus importantes sont :

  • form_start(form_view) : Affiche la balise d'ouverture
    , avec les attributs method et action correctement configurés.
  • form_end(form_view, options_array) : Affiche la balise de fermeture et tous les champs du formulaire qui n'ont pas encore été affichés explicitement (ce qui est utile pour les champs cachés comme le token CSRF).
  • form_widget(field_view, options_array) : Affiche le widget HTML (,