softcore hardcore

Les Formulaires Symfony

- Non, la je ne sais pas quoi dire.

Alors la prochaine fois kevin, profite en pour juste fermer ta gueule.


Les formulaires de symfony ne se présente pas comme un simple input html dont on récupèrerait les champs en POST.

Nan nan, vous allez commencer à voir le potentiel de symfony, et pleurer votre mère.

Partie 1 : Les TYPE, et je ne parle pas des gens

La base

La base des form Symfony c'est créer des "Types" qui vont monter (non, pas ta mère cette fois) le formulaire.

Dedans seront présent toutes les informations nécessaire au formulaire, fonctionne avec ou sans les entity, prend les class, le label, les vérifications, énormément de paramètres un joyeux bordel qui vous semblera incompréhensible.


Formulaire1 : petit formulaire pour les noob, Nom / prénom.

La variable form à passer à la vue grâce au formFactory :

                
    $form1 = $this->formFactory->create(Form1Type::class);
                
            

Le fameux "Form1Type" qui nous interesse particulièrement.

                
    namespace Bundle\Form;

    use Symfony\Component\Form\AbstractType;
    use Symfony\Component\Form\FormBuilderInterface;
    use Symfony\Component\Form\Extension\Core\Type;
    use Symfony\Component\Validator\Constraints as Assert;

    class Form1Type extends AbstractType
    {
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $builder
                ->add('prenom', Type\TextType::class)
                ->add('nom', Type\TextType::class)
            ;
        }
    }
                
            

Donc un formType c'est quoi ?

Une base identique à tous ( abstract type etc etc).

la fonction BuildForm, le builder. Et nos champs sont dans les "->add".

Les champs : nom, Type du champ ( parmis les X disponnibles, mais au besoin on peux créer le notre).

Et des paramètres, beaucoups que l'ont va pouvoir voir par la suite.

Pimp My Form

Go pimper un peu ce form so 1990.

Pour ça rien de plus simple, label, attributs, class, data, placeholder.

Chaque Type auquel le champ est attribué à ça propre liste d'options possible + une base commune FormType.

Exemple TextType

Formulaire2 : formulaire 1 version bonhomme

                
        $builder
            ->add('prenom', Type\TextType::class,
               ['label' => 'Ton prenom',
                'attr' => ['class' => 'form-control',
                            'data-fdp' => 'prenom connard',
                            'placeholder' => 'mets ton blaz ici pd'],
                'required' => false,
               ])
            ->add('nom', Type\TextType::class,
                ['label' => 'Ton nom ! *',
                    'attr' => ['class' => 'form-control',
                        'data-fdp' => 'nom enfoiré'],
                    'required' => true,
                    'data' => 'Toretto'
                ])
        ;
                
            

N'hésitez pas à fouiller pour bien comprendre tout ce que j'ai rajouté bande de salo.

Form Entity

En html, on fait les input etc et pour remplir une entity, obligé de récupérer chaque donner et de set.

Moi, ça me fais chier.

Mais pas avec symfony. Le formulaire peut être directement lié à l'entity.

J'ai créé une entity "produit" qui contient : name, price, magasin, type.

- Et du coup ton franglais dégueulasse tu en fais quoi ?

Bah je te le met ou je pense.


Formulaire3 : Mettons un petit formulaire pour créer un nouveau produit

                
        $produit = new Produit();
        $form3 = $this->formFactory->create(Form3Type::class, $produit);
                
            
			    
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('name', Type\TextType::class, ['attr' => ['class' => 'form-control']])
            ->add('price', Type\IntegerType::class, ['attr' => ['class' => 'form-control']])
            ->add('magasin', Type\TextType::class, ['attr' => ['class' => 'form-control']])
            ->add('type', Type\ChoiceType::class, [
                'attr' => ['class' => 'form-control'],
                'placeholder' => '',
                'choices' => [
                    'cadavre' => 'viande',
                    'poisson' => 'poisson',
                    'fruits' => 'fruits',
                    'xxxx' => 'legume',
                    'pains' => 'pains',
                    'frais' => 'frais',
                    'truc glacé' => 'surgelés',
                    'petits pains ou chocolatine ?' => 'epicerie',
                    'bière' => 'boissons',
                    'produits pour les filles' => 'hygiène',
                    'future cadavre' => 'animalerie',
                    'fringue' => 'textile']])
        ;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => 'Bundle\Entity\Produit'
        ]);
    }
			    
		    

J'en est profité pour rajouter des infos afin de gérer les types.

La précision est d'autant plus importante avec les formulaires dont on implique une entity, les champs doivent corréspondres à l'entity et le formulaire est soumis à certaines règles.

On peux facilement repérer tout un tas d'erreurs, pas le bon nom, champ rajouté sans qu'il fasse parti de l'entity etc.

Evidement ce formulaire pourrais ressembler à n'importe lequel sans l'entity, l'interet de cette entity nous la verrons une autre fois dans le cour sur la sauvegarde de données.

Form Entities

A partir de la on commence vraiment à s'amuser.

Ceux qui sont trop bêtes n'hésitez pas à partir, vous avez déjà les éléments qui sont à votre porté.

Pour cette partie je vais créer l'entity produit2 et magasin

Formulaire6 : Formulaire 3 avec ajout de l'entity magasin pour... bon fallait suivre.

			    
     $builder
            ->add('name', Type\TextType::class, ['attr' => ['class' => 'form-control']])
            ->add('price', Type\IntegerType::class, ['attr' => ['class' => 'form-control']])
            ->add('magasin', EntityType::class, [
                'attr' => ['class' => 'form-control'],
                'class' => 'Bundle\Entity\Magasin',
                'placeholder' => ''])
            ->add('type', Type\ChoiceType::class, [
                'attr' => ['class' => 'form-control'],
                'placeholder' => '',
                'choices' => [
                    'cadavre' => 'viande',
                    'poisson' => 'poisson',
                    'fruits' => 'fruits',
                    'xxxx' => 'legume',
                    'pains' => 'pains',
                    'frais' => 'frais',
                    'truc glacé' => 'surgelés',
                    'petits pains ou chocolatine ?' => 'epicerie',
                    'bière' => 'boissons',
                    'produits pour les filles' => 'hygiène',
                    'future cadavre' => 'animalerie',
                    'fringue' => 'textile']])
        ;
    }
			    
		    

A la création de ce formulaire je l'ai lié à l'entity Produit2, ce qu'on savait déjà faire.

Mais en plus dedans, le champ Magasin à été lié à l'entity Magasin.

C'est aussi modifiable et maléable autant qu'on veux. Toujours penser à regarder la doc officiel.

Dans EntityType je fouille un peu et je trouve l'option 'query_builder' qui va me permettre de changer l'affichage du Formulaire7

Encore un peu plus compliqué. On va essayer de mettre plusieurs Magasins pour un produit.

Pour ça j'ai encore créer un nouveau produit3 ainsi qu'un magasin2 qui seront en relation ManyToMany.

Et je vais utiliser les Collections pour le Formulaire8


La collection est un vaste sujet, mais pour essayer de faire simple, c'est un include d'un autre formulaire dans le formulaire.

Pour le gérer plus facilement et rajouter / modifier etc plus facilement j'ai fais appel à un vendor recommandé par symfony : Symfony Collection.

Très interessant et très vaste pour la gestion JS des collections, l'ajout / suppression etc de l'include directement en page.

Pour finir

Nous avons vu la beaucoup de chose qui constitu les formulaires symfony.

Le détail du traitement de donnés et le retour de ses formulaires sera vu une prochaine fois.

Si vous avez des choses que vous voulez essayer n'hésitez pas, Allez voir quelqu'un d'autre.