Symfony 5 - Créer un formulaire
symfony console make:form
Cette commande vous demande à partir de quelle entité vous devez créer ce formulaire
Vous pouvez donc rentrer par exemple "Product"
Cela va créer votre classe dans src/Form
Qui s'appellera ProductType.php
Nous pouvons donc maintenant appeler cette classe dans notre controleur et le passer à la vue
$product = new Product();
$form = $this->createForm(ProductType::class, $product);
Pour passer la variable form à la vue :
'form' => $form->createView()
Pour afficher notre formulaire en twig
{{ form_start(form) }}
{{ form_row(form) }}
{{ form_end(form) }}
Pour récupérer les données et les enregistrer en base de données, vous devez ajouter ces lignes dans votre formulaire :
Déjà on récupére l'objet $request pour avoir les données
use Symfony\Component\HttpFoundation\Request;
public function productAdd(Request $request): Response
Ensuite on met les données dans notre object $product
On regarde si le formulaire est valide
Et on persist et flush pour entrer les données
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$em->persist($product);
$em->flush();
}
Si vous voulez ensuite ajouter une redirection après l'envoi du formulaire, vous pouvez ajouter
return $this->redirectToRoute('products');
Ensuite on peut aussi ajouter des flash messages
$this->addFlash('notice', 'Votre produit est bien enregistré !');
Dans base.html.twig, on doit les afficher :
{% for message in app.flashes('notice') %}
<div class="alert alert-success mt-3" role="alert">
{{ message }}
</div>
{% endfor %}
Pour finir, voici notre code complet :
$em = $this->getDoctrine()->getManager();
$product = new Product();
$form = $this->createForm(ProductType::class, $product);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$em->persist($product);
$em->flush();
$this->addFlash('notice', 'Votre produit est bien enregistré !');
return $this->redirectToRoute('products');
}
return $this->render('product/add.html.twig', [
'form' => $form->createView()
]);
18/11/2021