Salut à tous,

J'ai un probléme avec le tuto sur l'espace membre. J'en suis à l'édition du profil, notamment au changement de mot de passe.

voila mon code :

/*
     * Edition d'un compte membre
     */
    public function edit() {
        $user_id = $this->Auth->user('id');

        // Securité
        if (!$user_id) {
            $this->redirect(array('action' => 'index'));
        }
        $this->User->id = $user_id;
        $passError = false;

        if ($this->request->is('put')) {
            $data = $this->request->data;
            $data'User']'id'] = $user_id;
            if (!empty($data'User']'pass1'])) {
                if ($data'User']'pass1'] == $data'User']'pass2']) {
                    $data'User']'password'] = Security::hash($data'User']'pass1'], null, true);
                } else {
                    $passError = true;
                }
            }
            if ($this->User->save($data, true, array('firstname', 'lastname', 'password'))) {
                $this->Session->setFlash("Profil mis à jour !");
            } else {
                $this->Session->setFlash("Impossible de sauvegarder !");
            }
            if ($passError) {
                $this->User->ValidationErrors'pass2'] = array("Le mot de passe n'est pas identique");
            }
        } else {
            $this->request->data = $this->User->read();
        }
    }

et l'erreur que CakePHP m'affiche :

Notice (8): Indirect modification of overloaded property User::$ValidationErrors has no effect [APP\Controller\UsersController.php, line 135]

Cette erreur arrive quand je rentre des mots de passe différents.

Une idée ? Merci !

18 réponses


Gregory
Réponse acceptée

Voici la fonction du tuto

function edit(){
$user_id = $this->Auth->user('id');
   if(!$user_id){
    $this->redirect('/');
    die();
  }
    $this->User->id = $user_id;
    $passErrors = false;
    if($this->request->is('put') || $this->request->is('post')){
        $d = $this->request->data;
        $d'User']'id'] = $user_id;
        if(!empty($d'User']'pass1'])){
            if($d'User']'pass1'] == $d'User']'pass2']){
                $d'User']'password'] = Security::hash($d'User']'pass1'],null,true);
            }else{
                $passErrors = true;
            }
        }
        if($this->User->save($d,true,array('firstname','lastname','password'))){
             $this->Session->setFlash("Votre compte a bien ete modifié","notif");
        }else{
            $this->Session->setFlash("Impossible de sauvegarder","notif",array('type'=>'error'));
        }
        if($passErrors){
            $this->User->validationErrors'pass2'] = array('Les mots de passe ne correspondent pas');
        }
    }else{
        $this->request->data =$this->User->read();
    }
    $this->request->data'User']'pass1'] = $this->request->data'User']'pass2'] = "";
}

Ca correspond à quelle ligne de ton code la ligne 135?

La ligne 34.

Le message d'erreur ne s'affiche pas.

Enleve la majuscule $this->User-> V alidationErrors'pass2'] ça devrait marcher

Je n'ai plus d'erreur. Mais le message disant que les mots de passe sont différents ne s'affiche pas ..

fais un debug de $parsError voir si i lest bien sur true?

je met debug($passError); ou ?

Je dois mettre quoi exactement ?

Mets le au dessus du if($passError)

Cela n'affiche rien du tout ..

Dans le if fais un debug($data) pour voir si il passe bien dans la condition

Ca m'affiche rien <<

Up s'il vous plaît !

fais le avant le if pour voir si tu passes dans ta condition if($passError)

Toujours rien -_-

Ok je crois que je viens de trouver a la place de if ($this->request->is('put')) mets
if ($this->request->is('put') || $this->request->is('post'))

Non, ça change rien !
Je met exactement le même code que dans le tuto c'est pas normal :( Help LeRaton !

C'est bon j'ai trouvé ! Merci :)