Formulaire réutilisable
Plutôt que de définir le formulaire dans le contrôleur et donc limiter son usage à ce seul composant, on préférera le créer dans une classe dédiée.
La classe hérite d'
AbstractType
et définira la méthode
buildForm
.
<?php namespace App\Form; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\Form\Extension\Core\Type\TextareaType; use Symfony\Component\Form\Extension\Core\Type\TextType; use Symfony\Component\Form\Extension\Core\Type\DateType; class ProfileType extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options) { $builder->add('id', TextType::class) ->add('titre', TextType::class) ->add('date', DateType::class) ->add('contenu', TextareaType::class) } public function getBlockPrefix() { return 'ProfileForm'; } } ?>
La fonction
getBlockPrefix
est utilisée pour le préfixe servant à identifier le formulaire et les
champs qui le composent.
Il suffit ensuite de faire appel au formulaire dans notre contrôleur
// src/Controller/ProfileController public function plusAction() { $profile = new Profile(); // On définit les options $options = array('action' => $this->generateUrl('lpars_cours_formulaires_plus')); // Génération du formulaire $form = $this->createForm(ProfileType::class, $diablo, $options); return $this->render('Profile:add.html.twig', array( 'form' => $form->createView())); }
Validation
La validation se fait directement dans les propriétés de l'objet, à
travers les contraintes fixées dans la méthode
loadValidatorMetadata
.
Les contraintes sont dans les classes définies dans l'espace de nom
Symfony\Component\Validator\Constraints\
.
PHP
public static function loadValidatorMetadata(ClassMetadata $metadata) { $metadata->addPropertyConstraint('titre', new Length( array('min' => 5, 'minMessage' => 'Titre trop court', 'max' => 140, 'maxMessage' => 'Titre trop long'))); }
Twig
On peut afficher les erreur propres à un champ au sein du formulaire
{{ form_errors(form.titre) }} {{ form_widget(form.titre, { 'attr':{'placeholder': 'Titre' }}) }}
Les contraintes sont explicitées dans la documentation Symfony
Aller plus loin
Appel à un autre formulaire
On peut appeler un formulaire à l'intérieur du builder d'un formulaire.
public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add('champ', TextType::class) ->add('otherForm', new NiceFormType()) ; }
Héritage
Les formulaires sont des objets et peuvent donc être déclinés à travers l'héritage afin d'en changer le comportement (modifier les champs, validation, etc).
<?php namespace App\Controller; use Symfony\Component\Form\FormBuilderInterface; class ProfileReducedType extends ProfileType { public function buildForm(FormBuilderInterface $builder, array $options) { // On fait appel à la méthode buildForm du parent parent::buildForm ( $builder, $options ); // On supprime les champs gérés en interne $builder->remove ( 'date' ); $builder->remove ( 'id' ); } public function getBlockPrefix() { return 'ProfileReducedForm'; } } ?>Exemple