Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente | ||
symfony4:formulaires_formulaire_avec_classe [2020/04/11 22:04] marclebrun [Création de la classe de formulaire] |
— (Version actuelle) | ||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
- | ====== Formulaire défini dans une classe ====== | ||
- | |||
- | ===== Création de la classe de formulaire ===== | ||
- | |||
- | <code bash> | ||
- | php bin/console make:form | ||
- | </code> | ||
- | |||
- | <code> | ||
- | The name of the form class : | ||
- | > ArticleType | ||
- | </code> | ||
- | |||
- | Donner à la classe un nom qui se termine par **Type** (par exemple **ArticleType** pour éditer | ||
- | des entités de type **Article**). | ||
- | |||
- | <code> | ||
- | The name of Entity or fully qualified model class name that the new form will be bound to (empty for none): | ||
- | > App\Entity\Article | ||
- | </code> | ||
- | |||
- | Donner le nom de l'entité si le formulaire est lié à une entité, sinon laisser vide. | ||
- | |||
- | <code php ArticleType.php> | ||
- | use Symfony\Component\Form\Extension\Core\Type\TextType; | ||
- | use Symfony\Component\Form\Extension\Core\Type\TextareaType; | ||
- | |||
- | class ArticleType extends AbstractType | ||
- | { | ||
- | public function buildForm(FormBuilderInterface $builder, array $options) | ||
- | { | ||
- | $builder | ||
- | ->add('denom', TextType::class, [ | ||
- | 'label' => "Dénomination de l'article", | ||
- | ]) | ||
- | ->add('desc', TextareaType::class, [ | ||
- | 'label' => "Descriptif", | ||
- | ]) | ||
- | ->add('couleur', TextType::class) | ||
- | // ... | ||
- | // ... | ||
- | ->add('save', SubmitType::class, [ | ||
- | 'label' => "Enregistrer" | ||
- | ]) | ||
- | ; | ||
- | } | ||
- | |||
- | public function configureOptions(OptionsResolver $resolver) | ||
- | { | ||
- | $resolver->setDefaults([ | ||
- | 'data_class' => Article::class, | ||
- | ]); | ||
- | } | ||
- | } | ||
- | </code> | ||
- | |||
- | ===== Utilisation dans un contrôleur ===== | ||
- | |||
- | Utiliser la méthode **createForm** du contrôleur : | ||
- | |||
- | <code php ArticleController.php> | ||
- | class ArticleController extends AbstractController | ||
- | { | ||
- | public function new() | ||
- | { | ||
- | $article = new Article(); | ||
- | | ||
- | // ... | ||
- | |||
- | $form = $this->createForm(ArticleType::class, $article); | ||
- | |||
- | return $this->render('article/edit.html.twig', [ | ||
- | 'form' => $form->createView(), | ||
- | ]); | ||
- | } | ||
- | } | ||
- | </code> | ||
- | |||
- | L'ajout d'options permet de redéfinir l'action et la méthode : | ||
- | |||
- | <code php ArticleController.php> | ||
- | // ... | ||
- | | ||
- | $form = $this->createForm(ArticleType::class, $article, [ | ||
- | 'action' => $this->generateUrl('target_route'), | ||
- | 'method' => 'GET' | ||
- | ]); | ||
- | | ||
- | // ... | ||
- | </code> | ||
- | |||
- | ===== Intégration dans un template ===== | ||
- | |||
- | Forme simple sans aucun contrôle sur le rendu : | ||
- | |||
- | <code twig templates/article/edit.html.twig> | ||
- | {{ form(form) }} | ||
- | </code> | ||
- | |||
- | Avec un bouton inséré à la fin: | ||
- | |||
- | <code twig templates/article/edit.html.twig> | ||
- | {{ form_start(form) }} | ||
- | {{ form_widget(form) }} | ||
- | <button type="submit" class="btn btn-primary">Enregistrer</button> | ||
- | {{ form_end(form) }} | ||
- | </code> | ||
- | |||
- | En spécifiant chaque champ (permet d'appliquer des options à chacun): | ||
- | |||
- | <code twig templates/article/edit.html.twig> | ||
- | {{ form_start(form) }} | ||
- | {{ form_widget(form.denom) }} | ||
- | {{ form_widget(form.desc) }} | ||
- | {{ form_widget(form.couleur) }} | ||
- | <button type="submit" class="btn btn-primary">Enregistrer</button> | ||
- | {{ form_end(form) }} | ||
- | </code> | ||