Bonjour,

Je cherche à faire un formulaire avec une condition.
L'idée et d'avoir dans ma table un champs "validé" et si ce champs est à 1 je veux désactiver certains input : "disabled".
J'ai pensé le faire dans Twig mais c'est pas sécure donc je voudrais le faire dans le FormBuilderInterface
Quelqu'un à déja fait cela ?
Une idée de comment faire ?

#Exemple bidon :
    public function buildForm(FormBuilderInterface $builder, array $options)
    {

        $ChampsValide = Matable.Valider;

        $builder
            ->add('title')
            ->add('category', EntityType::class, [
                'class' => Category::class,
                'choice_label' => 'title'
            ])
            ->add('content')
         if($ChampsValide==1){
                ->add('image', disabledType::class, [
                        'disabled' => 'disabled',
                    ])
          }
        ;
    }

Merci de vos conseils.
Bonne soirée

4 réponses


Bonsoir.
Ta syntaxe est incorrecte :

// Faux
$builder
    ->add('title')
    ->add('category', EntityType::class, [
        'class' => Category::class,
        'choice_label' => 'title'
    ])
    ->add('content')
    if($ChampsValide==1){
        ->add('image', disabledType::class, [
            'disabled' => 'disabled',
        ])
    }
    ;
// Correct
$builder
    ->add('title')
    ->add('category', EntityType::class, [
        'class' => Category::class,
        'choice_label' => 'title'
    ])
    ->add('content');
if ($ChampsValide == 1) {
    $builder->add('image', disabledType::class, [
        'disabled' => 'disabled',
    ]);
}

Sinon, que veux-tu dire en disant que via Twig ce n'est pas sécure ?
Tu es bien conscient que l'utilisateur n'a pas accès au code Twig, mais seulement au rendu HTML et qu'il n'est pas sorcier de modifier/supprimer un attribut HTML.
Donc que tu définisses un attribut disabled que ce soit via Twig ou via le back end, n'y change rien, si tu ne veux pas qu'un champ puisse être modifié, soit tu ne le met pas à disposition dans le formulaire, ou aors une fois le formulaire soumis, tu vérifies qu'il n'a pas été modifié et dans le cas contraire, il te suffit de redéfinir sa valeur par celle de base avant de faire la modification en base de données.
Mais ne te dis pas qu'il suffit de définir l'atribut disabled pour un input pour que l'utilisateur ne puisse pas le modifier.

CVNeo
Auteur

Hum je me disais que le composant FormBuilderInterface prévoyait le cas ou si ont mettait un champs en disabled il pouvait lui même ne pas enregistré une éventuelle donnée passé par le champs.
C'est ce que j'avais compris via la Doc : https://symfony.com/doc/4.0/reference/forms/types/text.html#disabled
Donc si je comprend bien, en plus d'ajouter le disabled il faut lors de l'enregistrement vérifier les champs concerné pour ne pas enregistrer les choses en DB ?
Du coup ont perd un peux l'interet du principe du framwork qui devrait prévoir de gérer ce genre de cas :(

Il existe plusieurs solutions à ton problème.
La plus simple : tu n'ajoutes pas les champs qui sont désactivés (il te faut juste un if et que le champ ne soit pas obligatoire, dans le cas de la création d'un enregistrement).
Ou alors si tu veux vraiment afficher les champs disabled, l'attribut disabled, not secure car le client peut modifier l'attribut html, donc du coup à la soumission de ton form, dans ton controller, il faut tester la valeur de $ChampValide pour hydrater ou pas certains champs.
Tu pourrais également faire ça avec un EventListener (FormEvents::SUBMIT) sur ton form, c'est un peu plus complexe, mais transparent pour ton controller...

CVNeo
Auteur

Merci Digivia, en faite cela ne fonctionne pas sur le problème dans l'autre post, j'ai cliqué trop vite sur résolu ;)