Vous êtes sur la page 1sur 15

symfony-forms

#symfony-
forms
Table des matières
À propos 1

Chapitre 1: Démarrer avec symfony-forms 2

Remarques 2

Examples 2

Installation ou configuration 2

Chapitre 2: Exemple d'événements de formulaire Symfony 3

Remarques 3

Examples 3

événement onPostSubmit 3

FormEvents :: PRE_SUBMIT 4

FormEvents :: PRE_SET_DATA 5

Chapitre 3: Formes 8

Syntaxe 8

Remarques 8

Examples 8

Créer un formulaire simple dans un contrôleur 8

Créer un type de formulaire personnalisé 9

Vérifiez si tous les champs sont rendus dans le modèle 10

Comment traiter les options de formulaire 10

Traiter des événements de formulaire 11

Crédits 13
À propos
You can share this PDF with anyone you feel could benefit from it, downloaded the latest version
from: symfony-forms

It is an unofficial and free symfony-forms ebook created for educational purposes. All the content
is extracted from Stack Overflow Documentation, which is written by many hardworking individuals
at Stack Overflow. It is neither affiliated with Stack Overflow nor official symfony-forms.

The content is released under Creative Commons BY-SA, and the list of contributors to each
chapter are provided in the credits section at the end of this book. Images may be copyright of
their respective owners unless otherwise specified. All trademarks and registered trademarks are
the property of their respective company owners.

Use the content presented in this book at your own risk; it is not guaranteed to be correct nor
accurate, please send your feedback and corrections to info@zzzprojects.com

https://riptutorial.com/fr/home 1
Chapitre 1: Démarrer avec symfony-forms
Remarques
Cette section fournit une vue d'ensemble de ce qu'est symfony-forms et pourquoi un développeur
peut vouloir l'utiliser.

Il convient également de mentionner tous les grands sujets dans les formulaires symfony, et de
les relier aux sujets connexes. La documentation de symfony-forms étant nouvelle, vous devrez
peut-être créer des versions initiales de ces rubriques connexes.

Examples
Installation ou configuration

Instructions détaillées sur la configuration ou l'installation de symfony-forms.

Lire Démarrer avec symfony-forms en ligne: https://riptutorial.com/fr/symfony-


forms/topic/10894/demarrer-avec-symfony-forms

https://riptutorial.com/fr/home 2
Chapitre 2: Exemple d'événements de
formulaire Symfony
Remarques
Accrochez-vous pour les événements de formulaire plus symfony dans l'exemple ci-dessus.

Examples
événement onPostSubmit

Ceci est une éducation de dans Symfony pour prendre les détails de la formation des utilisateurs.
Nous voulions appliquer la validation sur 2 champs, la date de fin des études et étudions
actuellement.

On Post Submit Event, We will check two things


1 - if the user checks the checkbox of is_currently studying then end date should be empty
2 - On the other side, we have to make sure, if end date is not empty, then is currently
studying check box should be unchecked.

/**
* Class QualificationFormType
* @package UsersBundle\Form\Type
*/
class QualificationFormType extends AbstractType
{

public function buildForm(FormBuilderInterface $builder, array $options)


{

$builder
->add('title')
->add('institution')
->add('startDate', 'date', [
'label' => 'Start Date',
'widget' => 'single_text',
'format' => 'dd-MM-yyyy',
'required' => true,
'constraints' => [
new Assert\NotBlank(),
new Assert\LessThan("today"),
],
'trim' => true,
'attr' => [
'maxlength' => '12',
'minlength' => '10',

https://riptutorial.com/fr/home 3
'placeholder' => 'when did you start this education?',
'class' => 'form-control input-inline datepicker datePicker',
'data-provide' => 'datepicker',
'data-date-format' => 'dd-mm-yyyy',
'minViewMode' => '1'
],
'label_attr' => [
'class' => 'control-label',
],
])
->add('endDate', 'date', [
'label' => 'End Date',
'widget' => 'single_text',
'format' => 'dd-MM-yyyy',
'required' => false,
'attr' => [
'placeholder' => 'when did you end this education?',
'class' => 'form-control input-inline datepicker datePicker',
'data-provide' => 'datepicker',
'data-date-format' => 'dd-mm-yyyy',
'minViewMode' => '1'
],
'label_attr' => [
'class' => 'control-label',
],
])
->add('current', null, [
'label' => ucfirst('I am currently studying'),
'label_attr' => [
'class' => 'control-label',
],
])
->add('save', 'submit')

$builder->addEventListener(FormEvents::POST_SUBMIT, [$this, 'onPostSubmit']);


}

function onPostSubmit(FormEvent $event) {


$form = $event->getForm();
$endDate = $form->get('endDate')->getData();
$current = $form->get('current')->getData();
If(!$current){
if ($startDate>$endDate ) {
$form['startDate']->addError(new FormError("Start Date cannot be greater
than end date..."));
}
}
}

FormEvents :: PRE_SUBMIT

Cet exemple concerne la modification du formulaire en fonction des décisions prises


précédemment par l'utilisateur avec le formulaire.

https://riptutorial.com/fr/home 4
Dans mon cas particulier, je devais désactiver une boîte de sélection si une case à cocher n'était
pas définie.

Nous avons donc le FormBuilder, où nous allons définir EventListener sur l' FormEvents::PRE_SUBMIT
. Nous utilisons cet événement, car le formulaire est déjà défini avec les données soumises du
formulaire, mais nous sommes toujours en mesure de manipuler le formulaire.

class ExampleFormType extends AbstractType


{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$data = $builder->getData();
$builder
->add('choiceField', ChoiceType::class, array(
'choices' => array(
'A' => '1',
'B' => '2'
),
'choices_as_values' => true,
))
->add('hiddenField', HiddenType::class, array(
'required' => false,
'label' => ''
))
->addEventListener(FormEvents::PRE_SUBMIT, function(FormEvent $event) {

// get the form from the event


$form = $event->getForm();

// get the form element and its options


$config = $form->get('choiceField')->getConfig();
$options = $config->getOptions();

// get the form data, that got submitted by the user with this request / event
$data = $event->getData();

// overwrite the choice field with the options, you want to set
// in this case, we'll disable the field, if the hidden field isn't set
$form->add(
'choiceField',
$config->getType()->getName(),
array_replace(
$options, array(
'disabled' => ($data['hiddenField'] == 0 ? true : false)
)
)
);
})
;
}
}

FormEvents :: PRE_SET_DATA

La condition est de vérifier si dans un formulaire, le champ 'Online_date' est vide ou rempli. S'il est
vide, remplissez-le avec la date du jour, sur le chargement du formulaire.

https://riptutorial.com/fr/home 5
Le contrôleur appelle "$ form-> createForm ()" avec le type "folder". Dans «FolderType», l'abonné
à l'événement «FolderSubscriber» est ajouté.

Contrôleur :

$form = $this->createForm('folder', $folder, array(


'action' => $this->generateUrl('folders_edit', array('id' => $folder-
>getId())),
'method' => 'post'
));

FolderType :

class FolderType extends AbstractType


{
public function __construct( FolderSubscriber $folderSubscriber)
{
$this->folderSubscriber = $folderSubscriber;
}

public function buildForm(FormBuilderInterface $builder, array $options = array())


{
$builder ->add("onlineDate", "datetime", array( 'widget' => 'single_text'));
$builder->addEventSubscriber($this->folderSubscriber);
}
public function getName()
{
return 'folder';
}
}

FolderSubscriber : Obtient appelé depuis FolderType; où il est enregistré en tant qu'abonné à


l'événement

class FolderSubscriber implements EventSubscriberInterface


{

public static function getSubscribedEvents()


{
return array(
FormEvents::PRE_SET_DATA => 'onPreSetData',
);
}

public function onPreSetData(FormEvent $event)


{
$this->setDefaultOnlineDate($event);
}

protected function setDefaultOnlineDate(FormEvent $event)


{
$content = $event->getData();
if (!$content->getOnlineDate() instanceof \DateTime){
$content->setOnlineDate(new \DateTime());
}
}
}

https://riptutorial.com/fr/home 6
Lire Exemple d'événements de formulaire Symfony en ligne: https://riptutorial.com/fr/symfony-
forms/topic/5039/exemple-d-evenements-de-formulaire-symfony

https://riptutorial.com/fr/home 7
Chapitre 3: Formes
Syntaxe
• Form createForm (string | FormTypeInterface $ type, mixed $ data = null, tableau $ options =
array ())
• FormBuilder createFormBuilder (mixte $ data = null, array $ options = array ())

Remarques
Vous pouvez "personnaliser" l'événement du processus du composant Form avec un événement
de formulaire compatible avec Event Dispatcher Component.

Docs Symfony :

Le composant Form fournit un processus structuré pour vous permettre de


personnaliser vos formulaires, en utilisant le composant EventDispatcher. En utilisant
des événements de formulaire, vous pouvez modifier des informations ou des champs
à différentes étapes du workflow: de la population du formulaire à la soumission des
données de la demande.

Examples
Créer un formulaire simple dans un contrôleur

Un formulaire permet à l'utilisateur de modifier les données de votre application de manière


structurée. Pour muter un simple array de données, nous créons un formulaire en utilisant un
générateur de formulaires:

use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\NumberType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;

// ...

function myAction (Request $request) {


$data = array(
'value' => null,
'number' => 10,
'string' => 'No value',
);
$form = $this->createFormBuilder($data)
->add('value', TextType::class, array('required' => false))
->add('number', NumberType::class)
->add('string', TextType::class)
->add('save', SubmitType::class)
->getForm();

$form->handleRequest($request);

https://riptutorial.com/fr/home 8
if ($form->isValid()) {

// $data is now changed with the user input


// Do something with the data
}

return $this->render(..., array(


'form' => $form->createView(),
// ...
));
}

Dans votre modèle, restituez votre formulaire en utilisant la form(...) Fonction Twig:

{# Render the form #}


{{ form(form) }}

Il va, sans style, ressembler à ceci:

Les étiquettes, identifiants, noms et balises de formulaire sont générés automatiquement. Par
défaut, le formulaire est soumis à la page en cours avec une requête POST.

Créer un type de formulaire personnalisé

Un type de formulaire personnalisé est une classe qui définit un composant de formulaire
réutilisable. Les composants de formulaire personnalisés peuvent être imbriqués pour créer des
formulaires compliqués.

Au lieu de créer un formulaire dans le contrôleur à l'aide d'un générateur de formulaires, vous
pouvez utiliser votre propre type pour rendre le code plus lisible, réutilisable et maintenable.

Créer une classe qui représente votre type de formulaire

// src/AppBundle/Form/ExampleType.php
namespace AppBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\NumberType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;

class ExampleType extends AbstractType


{
public function buildForm(FormBuilderInterface $builder, array $options) {
$builder
->add('value', TextType::class, array('required' => false))
->add('number', NumberType::class)

https://riptutorial.com/fr/home 9
->add('string', TextType::class)
->add('save', SubmitType::class)
;
}
}

Vous pouvez maintenant utiliser votre formulaire dans le contrôleur:

use AppBundle\Form\ExampleType;

// ...

$form = $this->createForm(ExampleType::class, $data)

Vérifiez si tous les champs sont rendus dans le modèle

Lors du rendu d'une forme "à la main", il peut être utile de savoir s'il reste des champs à rendre ou
non. La fonction isRendered() de la classe FormView renvoie true s'il reste des champs à restituer
dans le modèle.

Cet extrait imprime <h3>Extra fields</h3> s'il reste des champs à ajouter au modèle, suivis des
champs eux-mêmes.

{% if not form.isRendered() %}
<h3>Extra fields</h3>
{{ form_rest(form) }}
{% endif %}

Comment traiter les options de formulaire

Dans cet exemple, j'ai créé un formulaire qui sert à enregistrer un nouvel utilisateur. Dans les
options transmises au formulaire, je donne les différents rôles qu'un utilisateur peut avoir.

Créer une classe réutilisable pour mon formulaire avec la classe de données configurée et une
option supplémentaire qui remplit le champ de choix pour choisir un userrole:

class UserType extends AbstractType


{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('firstName', TextType::class, array(
'label' => 'First name'
))
->add('lastName', TextType::class, array(
'label' => 'Last name'
))
->add('email', EmailType::class, array(
'label' => 'Email'
))
->add('role', ChoiceType::class, array(
'label' => 'Userrole',
'choices' => $options['rolechoices']

https://riptutorial.com/fr/home 10
))
->add('plain_password', RepeatedType::class, array(
'type' => PasswordType::class,
'first_options' => array('label' => 'Password'),
'second_options' => array('label' => 'Repeat password')
))
->add('submit', SubmitType::class, array(
'label' => 'Register user'
));
}

public function configureOptions(OptionsResolver $optionsResolver)


{
$optionsResolver->setDefaults(array(
'data_class' => 'WebsiteBundle\Entity\User',
'rolechoices' => array()
));
}
}

Comme vous pouvez le voir, une option par défaut est ajoutée à la fiche nommée 'roleChoises'.
Cette option est créée et transmise dans la méthode pour créer un objet de formulaire. Voir le
code suivant.

Créer un objet formulaire dans mon contrôleur:

$user = new User();


$roles = array(
'Admin' => User::ADMIN_ROLE,
'User' => User::USER_ROLE
);
$form = $this->createForm(UserType::class, $user, array(
'rolechoices' => $roles
));

Traiter des événements de formulaire

Pour pouvoir traiter les événements de formulaire, il est important d'attacher la demande, qui est
envoyée à une action de contrôleur après avoir soumis un formulaire, au formulaire créé dans
cette action.

public function registerAction(Request $request)


{
$data = new ExampleObject();
$form = $this->createForm(ExampleObjectType::class, $data);

$form->handleRequest($request);
if($form->isSubmitted() && $form->isValid()){
// do something with form data
return $this->redirectToRoute('route_name');
}
return $this->render('view.html.twig', array(
'form' => $form->createView()
));
}

https://riptutorial.com/fr/home 11
La variable de requête transmise à l'action est de type Symfony\Component\HttpFoundation\Request

Lire Formes en ligne: https://riptutorial.com/fr/symfony-forms/topic/4440/formes

https://riptutorial.com/fr/home 12
Crédits
S.
Chapitres Contributeurs
No

Démarrer avec
1 Community
symfony-forms

Exemple
2 d'événements de Ajay Bisht, jkucharovic, KhorneHoly, Muhammad Taqi
formulaire Symfony

3 Formes Alfro, Hidde, jkucharovic, Mathieu Dormeval, rubenj

https://riptutorial.com/fr/home 13

Vous aimerez peut-être aussi