Salut,
j'ai un bug d'activation des comptes. Dans mon espace membres, j'envoie une adresse qui permet d'activer le compte d'un utilisateur. Le gros problème est les champ "active" et et "token" ne son pas modifié et les nouveaux utilisateurs ne peut pas se connecter car, il faut que leur compte soit activé.

voici ma fonction activate :

public function activate($user_id, $token){
        $user = $this->User->find('first', array(
            'conditions' => array('id' => $user_id, 'token' => $token,'active'=>0)
        ));
        if (empty($user)) {
            $this->Session->setFlash('Ce lien de validation ne semble pas bon');
            return $this->redirect('/');
        }
        $this->Session->setFlash('Votre compte a bien été validé');
        $this->User->save(array(
            'id' => $user'User']'id'],
            'active' => 1,
            'token' => ''
        ));
        return $this->redirect(array('action' => 'login'));
    }

Merci de votre aide.

29 réponses


lakamark
Auteur
Réponse acceptée

Merci à Lattak11 et Airday Il de vos aide. J'ai refaite la table users et elle va mieux. Les compte s'activent automatiquement.

Bonsoir.
Essais avec ça :

public function activate($user_id, $token){
        $user = $this->User->find('first', array(
                    'conditions' => array('id' => $user_id, 'token' => $token,'active'=>0)
                ));
        if (empty($user)) {
            $this->Session->setFlash('Ce lien de validation ne semble pas bon');
                    return $this->redirect('/');
                }/* Début modification */
                $save = array('id' => $user'User']'id'], 'active' => 1, 'token' => '');
                if($this->User->save($save)){
                    $this->Session->setFlash('Votre compte a bien été validé');
                    return $this->redirect(array('action' => 'login'));
                }/* Fin */
            }
lakamark
Auteur

Oui j'ai une valeur par défaut qui est 0

lakamark
Auteur

euuh il me retourne un missing view et l'activation ne se fait pas...

Dans ce cas là, peut-être que le format de ton champ active n'est pas correct.
Ton champ active à le format Int?

lakamark
Auteur

Le champ "active" est bien "int(11)".

// active le compte
public function activate($user_id = null, $token = null) {
    $user = $this->User->find('first', array(
        'fields' => array('id'),
        'recursive => -1,
        'conditions' => array('User.id' = > $user_id, 'User.token' => $token)
    ));
    if (empty($user)) {
        $this->Session->setFlash('Ce lien de validation ne semble pas correct', 'flash', array('class' => 'error'));
        return $this->redirect('/');
    }
    $this->User->set(array(
        'id' = > $user'User']'id'],
        'active' => 1,
        'token' => ''
    ));
    if ($this->User-> save()) {
        $this->Session->setFlash('Votre compte est maintenant activé', 'flash', array('class' => 'success'));
        return $this->redirect(array('action' => 'login'));
    } else {
        $errors = $this->User->validationErrors;
    }
}

Ton champs active doit etre un int(1) ou un bool() ou un tinyint()

@Airday : Le validationErrors , c'est pour les données retournées par formulaire, ce qui n'est pas le cas là.
Il faut éviter les formats bool et tinyint avec CakePHP, car il les interpètes mal, tu remarqueras d'ailleurs que tinyint retourne true ou false et non la valeur du champ.

lakamark
Auteur

J'ai toujours un missing view et il ne fait rien. :(

@Lartak11 : Merci, je me disais aussi pourquoi j'avais mis ce code là xD

Dans ta table as tu des clés étrangères ?
Car parfois il faut les définir si c'est en InnoDB.

lakamark
Auteur

Il est bien en InnoDB

Tu n'aurais pas un beforeSave qui coupe ton save par hasard ?
Fais un

debug($user); die();

après mon commentaire : /* Fin */ , pour voir ce qu'il te retourne.

lakamark
Auteur

Mon beforeSave() fait encodé le mot de passe.

Tu encode le mot de passe différemment de la méthode de CakePHP ?

lakamark
Auteur

Voici mon beforeSave() du model User

public function beforeSave() {
        if (isset($this->data$this->alias]'password'])) {
            $this->data$this->alias]'password'] = AuthComponent::password($this->data$this->alias]'password']);
        }
        return true;
    }

Montre nous le debug de $user :)

lakamark
Auteur

Voici le débug($user)

array(
    'User' => array(
        'password' => ' *****',
        'id' => '7',
        'Facebook_id' => '0',
        'username' => 'teste',
        'firstname' => '',
        'lastname' => '',
        'country' => '',
        'city' => '',
        'music' => '',
        'bio' => '',
        'slogan' => '',
        'facebook' => '',
        'twitter' => '',
        'website' => '',
        'mail' => 'teste@teste.com',
        'active' => '0',
        'token' => '92e0200aab34309fbf812c993400a039',
        'role' => 'user',
        'created' => '2014-01-05 19:45:06',
        'thumb' => ''
    )
)

L'active est rester 0 et le token n'est pas vide.

Tu n'as pas besoin d'un beforeSave pour encoder ton mot de passe alors, il te suffit lorsque tu récupères les données, que tu fasse comme ça :

$this->request->data'User']'password'] = $this->Auth->password($this->request->data'User']'password']);

Vu que je ne pense pas que tu aies des modifications du mot de passe en dehors de l'inscription et dans l'édition du profil, tu n'as pas besoin de faire un beforeSave juste pour "encoder" le mot de passe.
En plus de ça, ça m'étonne que tu n'ai pas d'erreur avec ton beforeSave, car normalement il faut mettre

public function beforeSave($options = array())

et le

$this->alias

n'est pas utile si le beforeSave n'est que pour ton modèle User, normalement c'est pour les Behavior.
Je dis ça au passage, ce n'est pas ça qui te bloque pour modifier les champs token et activate.

lakamark
Auteur

Juste à enlevé mon beforeSave est dans ma fonction signup j'encode le mot de passe? Désolé, il y a un bug il ne fait aucune modifidactions.

Oui, tu peux mettre la ligne que je t'ai donné avec le Auth password.
Mais bon, ce n'est pas ça qui bloque ton save, comme ça je ne vois pas ce que ça peut être vu que dans ton debug il retourne bien les champs nécessaires pour la sauvegarde et qu'il reconnait bien la valeur de ton champ active comme une donnée numérique.
Bien que tu pourrais quand même limiter les champs retournés par le find, car ta table users est blindée.

Le mieux est que tu fasse :

public function activate($user_id = null, $token = null) {
    $user = $this->User->find('first', array(
        'fields' => array('id'),
        'recursive => -1,
        'conditions' => array('User.id' = > $user_id, 'User.token' => $token)
    ));
    debug($user);
    if (empty($user)) {
        $this->Session->setFlash('Ce lien de validation ne semble pas correct', 'flash', array('class' => 'error'));
        return $this->redirect('/');
    }
    $this->User->set(array(
        'id' = > $user'User']'id'],
        'active' => 1,
        'token' => ''
    ));
    $this->User->save();
    $user2 = $this->User->find('first', array(
        'recursive => -1,
        'conditions' => array('User.id' = > $user_id)
    ));
    debug($user2); die();
}
lakamark
Auteur

euuh Facebook id est un BigInt c'est seulement des chiffre.

lakamark
Auteur

Je ne sais plus quoi faire. Le problème est toujours là

Pourquoi tu nous parle du champ facebook_id ?
Il n'a rien à voir avec ta fonction d'activation du compte.

lakamark
Auteur

Le facebook_id est si un utilisateur se connecte avec facebook. Dans ce cas on l'oublie

@Lartak11: c'est moi qui en parle, car j'ai eu un problème avec cette méthode activate, j'avais ma BDD en InnoDB et j’étais obliger de définir mes différentes clés étrangères si je voulais qu'une modification se fasse, je ne sais pas d’où pouvez venir cette erreur.

C'est toi qui en parle, pas nous. :p

lakamark
Auteur

Je pense que je vais refaire la table users