Bonsoir à tous,

Je découvre tranquillement CakePHP 3 et je suis confronté à un petit problème que je n'arrive pas à résoudre.

J'ai créé un espace utilisateur dans lequel on peux modifier son profile et en particulier changer son mot de passe (un classique !).
Ce que je souhaite faire, pour une question de sécurité, c'est demander à l'utilisateur son mot de passe actuel pour qu'il puisse le changer.

Ce que je n'arrive pas à faire c'est de créer une régle de validation qui lui indiquerait que le mot de passe qu'il rentre n'est pas celui qui est enregistré en base de donnée.
J'ai regardé pour le faire avec une closure mais on ne peux comparer que la valeur soumise et le contexte comme indiqué dans la doc.

J'ai donc pensé le faire du côté du controller où je vérifie la correspondance des mots de passe. Tout fonctionne !
Le seul problème c'est que je souhaiterais indiquer à l'utilisateur qu'il s'est trompé de mot de passe en affichant à la fois un message flash (ça c'est OK) et un message d'erreur au niveau de l'input du formulaire.

D'où ma question : est-il possible de le faire ?

Avec CakePHP 2, on pouvait récupéré les erreurs de validation d'un formulaire et le retourner comme ceci :

$this->User->validationError['champ'];

Peut-on faire de même avec Cake3 ou est-ce qu'il y a une méthode plus appropriée pour le faire ?

5 réponses


Romano83
Auteur
Réponse acceptée

Salut à tous,

C'est normal, vu que la méthode validationErrors n'existe pas dans la V3 de CakePHP.

oui, je sais ! c'est ce que j'ai dis sur mon premier post mais j'ai du mal m'exprimer...

@ freezlike : faire de l'ajax sur un seul champ ne me motive pas trop... si tout le formulaire avait été soumis en ajax, je ne dis pas...

Sinon, j'ai trouvé une solution, peut être pas très "académique" mais elle fonctionne. J'ai tout simplement créé une fonction privée au niveau de mon controller qui utilise la classe Validator. Elle vérifie si il n'y a pas d'erreur et en cas d'erreurs, elle réinjecte au niveau de l'entité le tableau d'erreurs :

private function _validateOldPassword(Entity $user, $data){
        $validator = new Validator();
        $validator->add('password_old', [
                'equalToPassword' => [
                        'rule' => function() use ($user){
                            return DefaultPasswordHasher::check($user->password_old, $user->password);
                        },
                        'message' => 'les deux mots de passe ne correspondent pas' 
                ]
        ]);
        $error = $validator->errors($data, false);  
        if($error){
            return $user->errors($error);
        }else{
            return true;
        }
    }

En tout cas, merci à vous pour votre aide ;)

Bien le bonsoir !

Tu peux accéder avec cakephp3 aux erreurs de formulaire depuis la vue comme ceci :

$this->validationErrors;

Dans un controller :

$this->ModelName->validationErrors;
Romano83
Auteur

Il me semblait que j'avais déjà essayé cette solution mais je n'étais pas sûr.

Quand j'essaie d'utiliser :

$this->ModelName->validationErrors;

J'ai une erreur interne qui me dit que mon model n'est pas associé avec le model validationErrors...

Idem lorsque j'utilise ta première solution earhater...

Une autre idée ?

J'ai une erreur interne qui me dit que mon model n'est pas associé avec le model validationErrors...

C'est normal, vu que la méthode validationErrors n'existe pas dans la V3 de CakePHP.

  • Controller::validate() et Controller::validationErrors() ont été retirées. Il y avait d’autres méthodes laissées depuis l’époque de 1.x, où les préoccupations des models + controllers étaient bien plus étroitement liées.

Source : 3.0 Guide de Migration » Controller

Bonsoir,
pourquoi tu n'essaie pas de faire ça en ajax avec une action afin de vérifier l'ancien mot de passe et le submit des changements à faire ?

ps : il se peut qu'on soit pas sur la même longueur d'onde enfin la façon de voir les choses.

Cordialement.