Bonjour,
Je crée un formulaire de modification pour l'utilisateur ou il peut modifier :

  • Nom
  • Prenom
  • Email
  • Mot de passe

je voudrais que si le mot de passe est vide il ne change pas or, quand je soumet le formulaire il y a une erreur qui me dit

Type error: Argument 1 passed to AppBundle\Entity\User::setPassword() must be of the type string, null given, called in J:\Applications\wamp64\www\labo\CGHBasket_symf20180126_3.4.3\vendor\symfony\symfony\src\Symfony\Component\PropertyAccess\PropertyAccessor.php on line 623

// Pour corriger j'ai appliquer cette modification

   public function setPassword(?string $password)
    {
        $this->password = $password;
    }

Mais le mot de passe change tout de même.

Ce que je fais

Donc je me suis dit, si je supprime les données du password dans le PRE_SUBMIT sa réglera le probléme

 $builder->addEventListener
        (
            FormEvents::PRE_SUBMIT,
            function(FormEvent $event) {
                $form = $event->getForm();
                $user = $event->getData();

                if($user['password']['first'] == $user['password']['second'] && empty($user['password']['first'])) {
                    unset($user['password']);
                }

                dump($user);

                //$form->addError(new FormError('TEST'));

                $event->setData($user);
            }
        );

Malheureusement cela ne fonctionne pas, je pense donc que je m'y prend mal il y a sans doute une solution qui permet de dir "Si un champ est vide tu l'ignore".

Merci pour votre aide :)

2 réponses


Bonsoir.
Ta question me parait similaire à celle que tu avais posé à ton dernier sujet et auquel j'ai répondu.

Elya
Auteur

Je ne suis pas sûr cette fois que les groupes peuvent résoudre le probléme. Dans mon formulair précédent qui était la Connexion je n'avais pas besoin du nom et prénom donc avec les groups sa a fonctionner nickel.

La le soucie c'est que password j'en ai besoin sauf que quand il est vide il faut qu'au moment du update il ne ce modifie pas. Pour le moment j'ai trouver une solution qui fonctionne mais s'il y a une solution plus propre je suis preneur.

(Au passage je voulais te remercier pour ton aide mais une fois qu'on a m'y en resolut on ne peut plus mettre de message :/ donc j'en profite, merci :) )

Sinon voici ma solution actuelle :

public function EditAction(Request $request) {

        $session = $this->get('session');

        if($this->isUserAuth(-1) == false) {
            return $this->redirectToRoute('error_deny');
        }

        $options = [];
        $options['name'] = 'member';
        $options['title'] = 'Member - modification';

        $user = $this->getDoctrine()
                ->getRepository(User::class)
                ->find($session->get('user')->getId());

        $cloneUser = clone $user;

        $form = $this->createForm(UserType::class, $user);

        $form->handleRequest($request);

        if($form->isSubmitted() && $form->isValid()) {
            $user = $form->getData();

            // Si le mot de passe est vide alors on met l actuel
            if(is_null($user->getPassword()) == true) {
                $user->setPassword($cloneUser->getPassword());
            }
            else
            {
                $user->hashPassword();
            }

            $em = $this->getDoctrine()->getManager();
            $em->persist($user);
            $em->flush();

            $session->set('user', $user);
        }

        $options['form'] = $form->createView();

        return $this->render('./CGH/pages/members/edit-member.html.twig', $options);
    }