Bonjour,

Dans mon backend j'aimerais pouvoir modifier un utilisateur.
Dans ces informations se trouve le Password.

Mon problème est quand je rend mon formulaire, le Password est vide et du coup la modification ne peux pas se faire.

J'aimerais que le mots de passe soit modifier uniquement quand le mot de passe est rempli (ou alors soit recuperer et ecrit en cripter )
pour que je puisse modifier les autres informations quand meme.

Mon Form UserType :

<?php

namespace App\Form\Admin;

use App\Entity\User;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\PasswordType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Validator\Constraints\Length;
use Symfony\Component\Validator\Constraints\NotBlank;

class UserType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('username')
//            ->add('roles')
            ->add('email')
            ->add('createdAt')
            ->add('firstName')
            ->add('lastName')
            ->add('password', PasswordType::class, [
                // instead of being set onto the object directly,
                // this is read and encoded in the controller
                'mapped' => true,
                'required' => false,
//                'always_empty' => false,
                'constraints' => [
                    new NotBlank([
                        'message' => 'Veuillez entrer un mot de passe',
                    ]),
                    new Length([
                        'min' => 6,
                        'minMessage' => 'Votre mot de passe doit contenir au moins {{ limit }} caractères.',
                        // max length allowed by Symfony for security reasons
                        'max' => 4096,
                    ]),
                ]
            ])
            ->add('confirmPassword', PasswordType::class, [
                // instead of being set onto the object directly,
                // this is read and encoded in the controller
                'mapped' => false,
                'required' => false,
            ])
            ->add('status')
            ->add('publish', SubmitType::class, [
                'label' => 'Publier',
                'attr' => [
                    'class' => 'btn-success btn-block'
                ]
            ])
            ->add('draft', SubmitType::class, [
                'label' => false,
                'attr' => [
                    'class' => 'btn-warning mdi mdi-24px mdi-content-save'
                ]
            ])
            ->add('waiting', SubmitType::class, [
                'label' => false,
                'attr' => [
                    'class' => 'btn-info mdi mdi-24px mdi-inbox-arrow-down',
                ],
            ])
            ->add('delete', SubmitType::class, [
                'label' => false,
                'attr' => [
                    'class' => 'btn-danger mdi mdi-delete-forever-outline mdi-24px'
                ],
            ]);
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => User::class,
            'translation_domain' => 'forms'
        ]);
    }
}

Je pensais avoir trouver ma réponse avec ' 'always_empty' => false,' mais non...

Merci par avance pour vos réponses.

3 réponses


Digivia
Réponse acceptée

Hello,

La solution que j'utilise pour palier à ce problème est simple : tu crée une propriété $plainPassword dans ton entité user, que tu utilises dans ton form. C'est un champ de type Repeated, non obligatoire. Ensuite, à la soumission de ton form, tu testes si ce champ est renseigné, et si oui, tu encryptes le password saisi et tu le persiste en DB.
Pour l'encryptage, tu peux utiliser Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface, cette interface est reconnue comme service dans Symfony.
Il faut utiliser la méthode encodePassword à laquelle tu passes ton entité User et le mot de passe en clair. Il te retourne le mot de passe encrypté. Enjoy!

aka-aka
Auteur

Super !

Ça la l’air d’être une bonne solution ! Je me suis pas beaucoup penché sur les Form encore.

J’ai vu cette après-midi qu’il existait le repeatType donc demain je vais regarder pour mettre ça en place.

J’ai vu aussi la possibilité de créer des groups c’est assez puissant !

En tout cas merci pour ta solution. C’est vraiment appréciable d’avoir des personnes à l’écoute ...

aka-aka
Auteur

Je viens de faire ce que tu m'as dit @Digivia et ça marche parfaitement !!
Un grand merci :)