Symfony : – Les formulaires “Champs”

03:49:44

Symfony propose une large gamme de types de champs de formulaire qui permettent de gérer efficacement les entrées utilisateur. Chaque type est conçu pour répondre à des besoins spécifiques et offre des options variées pour personnaliser leur comportement. Cette section détaille certains types courants, leurs options et leurs cas d’utilisation.

Héritage des Types

Chaque type de champ peut hériter d’un autre type, généralement du FormType. Cela signifie qu’un type hérite des options et fonctionnalités de son parent. Par exemple,

TextType

hérite de

FormType

et inclut donc toutes ses options.

Pour consulter les options disponibles pour un type, il est utile de vérifier ses parents.

🔗 Documentation des types : Symfony Form Types Reference

Le Type FormType

Le FormType est un type générique utilisé comme base pour de nombreux autres types. Bien qu’il soit rarement utilisé directement, ses options sont fondamentales.

Options courantes :

  • label

    : Définit le texte affiché à côté du champ.

    $formBuilder->add('nom', TextType::class, ['label' => 'Nom complet']);
    
  • data : Définit la valeur par défaut du champ. $formBuilder->add('nom', TextType::class, ['data' => 'Valeur par défaut']); required : Rend un champ obligatoire. $formBuilder->add('email', EmailType::class, ['required' => true]); disabled : Désactive un champ (lecture seule). $formBuilder->add('age', IntegerType::class, ['disabled' => true]); mapped : Indique si le champ est associé à l'objet du modèle. $formBuilder->add('captcha', TextType::class, ['mapped' => false]); attr : Ajoute des attributs HTML au champ. $formBuilder->add('nom', TextType::class, [ 'attr' => ['class' => 'form-control', 'placeholder' => 'Entrez votre nom'] ]);
Champs Courants a. TextType Le type TextType est utilisé pour créer des champs de saisie de texte simple. $formBuilder->add('nom', TextType::class); b. PasswordType Permet de saisir un mot de passe masqué. $formBuilder->add('mot_de_passe', PasswordType::class, ['always_empty' => false]); c. RepeatedType Représente deux champs identiques, souvent utilisé pour confirmer un mot de passe. $formBuilder->add('mot_de_passe', RepeatedType::class, [ 'type' => PasswordType::class, 'first_options' => ['label' => 'Mot de passe'], 'second_options' => ['label' => 'Confirmez le mot de passe'] ]); d. ChoiceType Permet de créer des listes déroulantes, des boutons radio ou des cases à cocher. $formBuilder->add('genre', ChoiceType::class, [ 'choices' => ['Homme' => 'homme', 'Femme' => 'femme', 'Autre' => 'autre'], 'expanded' => true, // Boutons radio 'multiple' => false // Un seul choix possible ]); e. EntityType Spécifique à Doctrine, ce type permet de gérer des entités. $formBuilder->add('categorie', EntityType::class, [ 'class' => Categorie::class, 'choice_label' => 'nom' ]); f. DateType Pour gérer les dates avec différents formats et widgets. $formBuilder->add('date_naissance', DateType::class, [ 'widget' => 'choice', // Listes déroulantes 'years' => range(date('Y') - 100, date('Y')) ]); g. FileType Permet de charger des fichiers. $formBuilder->add('document', FileType::class, ['multiple' => true]); h. CheckboxType Ajoute une case à cocher. $formBuilder->add('newsletter', CheckboxType::class, [ 'label' => 'S’abonner à la newsletter', 'required' => false ]); i. SubmitType Ajoute un bouton de soumission. $formBuilder->add('envoyer', SubmitType::class); Configuration Avancée a. Validation des Champs La validation côté formulaire est complémentaire à celle définie dans l’entité ou directement dans le formulaire. Les messages d’erreur peuvent être configurés directement dans les options des champs. b. Gestion des Groupes Les choix dans un ChoiceType peuvent être regroupés avec l’option group_by . $formBuilder->add('pays', ChoiceType::class, [ 'choices' => [ 'Europe' => ['France' => 'FR', 'Allemagne' => 'DE'], 'Amérique' => ['États-Unis' => 'US', 'Canada' => 'CA'] ], 'group_by' => function($choice, $key, $value) { return $choice->getRegion(); } ]); c. Gestion des Fichiers La manipulation des fichiers est facilitée grâce à l'objet UploadedFile . Par exemple, pour enregistrer un fichier dans un répertoire spécifique : if ($fichier->isValid()) { $fichier->move('/chemin/destination', 'nouveau_nom.pdf'); } Validation Serveur vs Client : Bien que Symfony utilise les attributs HTML5 ( required , etc.), ils doivent être considérés comme une aide supplémentaire. La validation côté serveur est impérative pour éviter les failles. Personnalisation des Labels : Utilisez l’option label pour des labels clairs et accessibles. Gestion des Erreurs : Configurez error_bubbling pour afficher les erreurs globales ou proches des champs concernés. 🔗 Documentation Officielle Symfony sur les Types : Symfony Form Types 🔗 Gestion des Fichiers Symfony : Symfony File Upload 🔗 Validation Symfony : Validation Constraints Les types de champs de formulaire de Symfony offrent une flexibilité et une puissance remarquables pour gérer les interactions utilisateur. Leur connaissance approfondie permet de créer des formulaires adaptés, ergonomiques et sécurisés. Une bonne maîtrise des options et des possibilités avancées comme l’intégration avec Doctrine ou la gestion des fichiers est essentielle pour tirer pleinement parti de ce composant.
par admin4460
Nom d'utilisateur Mot de passe Mot de passe oublié? Se connecter © MyCreaNet 2025 Mentions légales Plan du site Gestion des cookies Accessibilité
{"prefetch":[{"source":"document","where":{"and":[{"href_matches":"\/*"},{"not":{"href_matches":["\/wp-*.php","\/wp-admin\/*","\/wp-content\/uploads\/*","\/wp-content\/*","\/wp-content\/plugins\/*","\/wp-content\/themes\/Divi\/*","\/*\\?(.+)"]}},{"not":{"selector_matches":"a[rel~=\"nofollow\"]"}},{"not":{"selector_matches":".no-prefetch, .no-prefetch a"}}]},"eagerness":"conservative"}]} .et-fb-form__toggle[data-name="et_pb_db_php_code_main_content"] .et-code-snippets-library-btns-wrap:before, .et-fb-form__toggle[data-name="et_pb_db_php_code_main_content"] .et-code-buttons-wrapper:before { content: "\45"; font-size: 27px; color: #ccffcc; font-family: ETModules; cursor: pointer; width: 28px; height: 27px; border-radius: 3px; padding-top: 1px; background-color: rgb(255, 255, 255, 0.2) !important; } .et-fb-form__toggle[data-name="et_pb_db_php_code_main_content"] .et-fb-form__group:nth-of-type(4) { display: none; } jQuery(document).ready(function($) { $(document).on('click', '.et-fb-form__toggle[data-name="et_pb_db_php_code_main_content"] .et-code-snippets-library-btns-wrap, .et-fb-form__toggle[data-name="et_pb_db_php_code_main_content"] .et-code-buttons-wrapper', function(event) { if (event.target !== event.currentTarget) { return; // Exit the function if the click is on a child element } var firstEditor = $('.et-fb-form__toggle[data-name="et_pb_db_php_code_main_content"] .CodeMirror').get(0)?.CodeMirror; if (!firstEditor) { return; } $('.et-fb-form__toggle[data-name="et_pb_db_php_code_main_content"] textarea[name="code_to_render"]').click(); // Enable hidden codemirror var secondEditor = $('.et-fb-form__toggle[data-name="et_pb_db_php_code_main_content"] .CodeMirror').get(1)?.CodeMirror; if (!secondEditor) { return; } var content = firstEditor.getValue(); // Add a random nonce as the first line of content to prevent caching var nonce = Math.random().toString(36).substring(2, 15); content = '/* nonce:' + nonce + ' */\n' + content; secondEditor.setValue(content); }); }); (function() { var file = ["https:\/\/mycreanet.fr\/wp-content\/et-cache\/4986\/et-divi-dynamic-tb-8749-tb-7217-tb-6415-4986-late.css"]; var handle = document.getElementById('divi-style-inline-inline-css'); var location = handle.parentNode; if (0===document.querySelectorAll('link[href="' + file + '"]').length) { var link = document.createElement('link'); link.rel = 'stylesheet'; link.id = 'et-dynamic-late-css'; link.href = file; location.insertBefore(link, handle.nextSibling); } })(); var et_link_options_data = [{"class":"et_pb_post_title_0_tb_header","url":"https:\/\/mycreanet.fr\/dashboard\/","target":"_self"},{"class":"et_pb_code_0_tb_header","url":"https:\/\/mycreanet.fr\/work\/","target":"_self"}]; /* <![CDATA[ */ wp.i18n.setLocaleData( { 'text direction\u0004ltr': [ 'ltr' ] } ); /* ]]> */ /* <![CDATA[ */ ( function( domain, translations ) { var localeData = translations.locale_data[ domain ] || translations.locale_data.messages; localeData[""].domain = domain; wp.i18n.setLocaleData( localeData, domain ); } )( "contact-form-7", {"translation-revision-date":"2025-02-06 12:02:14+0000","generator":"GlotPress\/4.0.1","domain":"messages","locale_data":{"messages":{"":{"domain":"messages","plural-forms":"nplurals=2; plural=n > 1;","lang":"fr"},"This contact form is placed in the wrong place.":["Ce formulaire de contact est plac\u00e9 dans un mauvais endroit."],"Error:":["Erreur\u00a0:"]}},"comment":{"reference":"includes\/js\/index.js"}} ); /* ]]> */ /* <![CDATA[ */ var wpcf7 = { "api": { "root": "https:\/\/mycreanet.fr\/wp-json\/", "namespace": "contact-form-7\/v1" } }; /* ]]> */ /* <![CDATA[ */ var tocplus = {"smooth_scroll":"1","visibility_show":"Afficher","visibility_hide":"Masquer","width":"Auto"}; /* ]]> */ /* <![CDATA[ */ var DIVI = {"item_count":"%d Item","items_count":"%d Items"}; var et_builder_utils_params = {"condition":{"diviTheme":true,"extraTheme":false},"scrollLocations":["app","top"],"builderScrollLocations":{"desktop":"app","tablet":"app","phone":"app"},"onloadScrollLocation":"app","builderType":"fe"}; var et_frontend_scripts = {"builderCssContainerPrefix":"#et-boc","builderCssLayoutPrefix":"#et-boc .et-l"}; var et_pb_custom = {"ajaxurl":"https:\/\/mycreanet.fr\/wp-admin\/admin-ajax.php","images_uri":"https:\/\/mycreanet.fr\/wp-content\/themes\/Divi\/images","builder_images_uri":"https:\/\/mycreanet.fr\/wp-content\/themes\/Divi\/includes\/builder\/images","et_frontend_nonce":"80981f4e81","subscription_failed":"Veuillez v\u00e9rifier les champs ci-dessous pour vous assurer que vous avez entr\u00e9 les informations correctes.","et_ab_log_nonce":"9df5ae6f19","fill_message":"S'il vous pla\u00eet, remplissez les champs suivants:","contact_error_message":"Veuillez corriger les erreurs suivantes :","invalid":"E-mail non valide","captcha":"Captcha","prev":"Pr\u00e9c\u00e9dent","previous":"Pr\u00e9c\u00e9dente","next":"Prochaine","wrong_captcha":"Vous avez entr\u00e9 le mauvais num\u00e9ro dans le captcha.","wrong_checkbox":"Case \u00e0 cocher","ignore_waypoints":"no","is_divi_theme_used":"1","widget_search_selector":".widget_search","ab_tests":[],"is_ab_testing_active":"","page_id":"4986","unique_test_id":"","ab_bounce_rate":"5","is_cache_plugin_active":"no","is_shortcode_tracking":"","tinymce_uri":"https:\/\/mycreanet.fr\/wp-content\/themes\/Divi\/includes\/builder\/frontend-builder\/assets\/vendors","accent_color":"#006666","waypoints_options":[]}; var et_pb_box_shadow_elements = []; /* ]]> */ /* <![CDATA[ */ var DiviBlogExtrasFrontendData = {"ajaxurl":"https:\/\/mycreanet.fr\/wp-admin\/admin-ajax.php","ajax_nonce":"3dfec2d039","et_theme_accent_color":"#006666"}; /* ]]> */ /* <![CDATA[ */ var wpcf7_recaptcha = { "sitekey": "6LdTHXQrAAAAACmbbt7TJPkqCEfzcO8TdF_cEKX-", "actions": { "homepage": "homepage", "contactform": "contactform" } }; /* ]]> */ .wptpa_song_infrmtn, .wptpa_currenttime, .wptpa_duration, .wptpa_song, .wptpa_dwn_cnt, .wptpa_play_cnt, .wptpa_num, .wptpa_h2, .wptpa_ads{ font-family: 'Roboto', sans-serif; } .wptpa_player { background: #FFFFFF !important; } .wptpa_heading:before, .wptpa_heading:after { background: #000000 !important; } .wptpa_song_infrmtn { color: #000000 !important; } .wptpa_btn .wptpa_icon { fill: #555555; } .wptpa_btn.actv .wptpa_icon, .wptpa_btn:hover .wptpa_icon{ fill: #00D084; } .wptpa_btn:before{ background: #555555 !important; } .wptpa_player .wptpa_seek, .wptpa_player .wptpa_loader { background: #FFDA48 !important; } .wptpa_player .wptpa_seek span, .wptpa_progress { background: #CF2E2E !important; } .wptpa_ads, .wptpa_currenttime, .wptpa_duration { color: #FFFFFF !important; } .wptpa_volume_seek:before { background: #FFDA48 !important; } .wptpa_volume_value { background: #CF2E2E !important; } .wptpa_pllst_itm { border-bottom: 1px solid rgba(255, 255, 255, 0.25) !important; background: #23C5A3 !important; color: #000000 !important; } .wptpa_pllst_itm.crrnt, .wptpa_pllst_itm:hover { background: #FFDA48 !important; color: #000000 !important; } .wptpa_pllst_itm:last-child { border-bottom: 0px solid rgba(255, 255, 255, 0.25) !important; } .wptpa_bars, .wptpa_bars:before, .wptpa_bars:after{ background: #000000 !important; } .wptpa_line { border-color: #000000 !important; } .wptpa_pllst_itm .wptpa_icon { fill: #000000; } .wptpa_dwn_cnt, .wptpa_play_cnt { color: #000000 !important; } .wptpa_scroll_bar { background: #000000 !important; }