Programmation PHP/Symfony/Formulaire

Un livre de Wikilivres.
Sauter à la navigation Sauter à la recherche


Le principe est d'ajouter des champs de formulaire en PHP, qui seront automatiquement convertis en code HTML correspondant.

Installation :

 composer require symfony/form

Pour ajouter des contrôles sur les champs :

 composer require symfony/validator

Contrôleur[modifier | modifier le wikicode]

Injection du formulaire dans un Twig[modifier | modifier le wikicode]

class HelloWorldController extends AbstractController
{
    /**
     * @Route("/helloWorld", name="helloWorld")
     *
     * @return Response
     */
    public function indexAction(Request $request)
    {
        $form = $this->createForm(HelloWorldForm::class);

        return $this->render('helloWorld.html.twig', [
            'form' => $form->createView(),
        ]);
    }
}

Le second paramètre de createForm() est facultatif est sert à préciser des valeurs initiales dans le formulaire qui seront injectées en Twig, mais elles peuvent aussi l'être via le fichier du formulaire dans les paramètres de chaque champ.

Traitement post-validation[modifier | modifier le wikicode]

Dans la même méthode du contrôleur qui injecte le formulaire, il faut prévoir le traitement post-validation :

    $form->handleRequest($request);
    if ($form->isSubmitted() && $form->isValid()) {
        $email = $form->get('email')->getData();
        // ...
    }

Fichier du formulaire[modifier | modifier le wikicode]

Dans SF4, l'espace de nom Symfony\Component\Form\Extension\Core\Type propose 35 types de champ, tels que :

  • email (avec validation en option de la présence d'arrobase ou de domaine).
  • submit (bouton).
  • date.

Exemple :

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('email', 'text', [
                'required' => true,
        ]);
    }

Pour préremplir des valeurs dans les champs :

    $form->get('email')->setData($user->getEmail());

EntityType[modifier | modifier le wikicode]

De plus, en installant Doctrine, il est possible d'ajouter un type de champ "entité" directement relié avec un champ de base de données[1].

Attention !
link={{{link}}}

Il n'y a pas de type checkbox ou radiobox comme mais il faut jouer sur deux paramètres de EntityType ainsi :

Élément Expanded Multiple
Sélecteur false false
Sélecteur multiple false true
Boutons radio true false
Cases à cocher true true

Exemple :

    $builder->add('gender', EntityType::class, ['expanded' => true, 'multiple' => false]);

Appel du formulaire Symfony dans la vue[modifier | modifier le wikicode]

Les fonctions Twig permettant d'ajouter les éléments du formulaire sont :

  • form_start
  • form_errors
  • form_row
  • form_widget
  • form_label

Pour afficher tout le formulaire, dans l'ordre où les champs ont été définis en PHP :

    {{ form_start(form) }}
    {{ form_end(form) }}

Pour n'afficher qu'un seul champ :

{{ form_widget(form.choosen_credit_card) }}

Les même attributs qu'en PHP peuvent être définis en paramètre. Ex :

{{ form_widget(form.name, {'attr': {'class': 'address', 'placeholder': 'Entrer une adresse'} }) }}
{{ form_label(form.name, null, {'label_attr': {'class': 'address'}}) }}

Exemple complet :

{{ form_start(form) }}
    {{ form_errors(form) }}

    {{ form_label(form.name, 'Label du champ "name" écrasé ici') }}
    {{ form_row(form.name) }}
    {{ form_widget(form.message, {'attr': {'placeholder': 'Remplacez ce texte par votre message'} }) }}

    {{ form_rest(form) }}

    {{ form_row(form.submit, { 'label': 'Submit me' }) }}
{{ form_end(form) }}

Références[modifier | modifier le wikicode]