Bonjour, tout le monde étant sur Cake et voulant faire ma partie User, j'aimerais enregistré la dernière connexion, ainsi que l'IP de mon visiteur lorsqu'il se connecte, donc du coup dans le UsersTable j'ai fait un beforeSave !

public function beforeSave(Event $event){
        $userId = $session->read('Auth.User.id');
        $user = $users->get($userId);
        $data = [
            'lastlogin' => '2014-04-12 12:22:30'
        ];
        var_dump($data);
        $users->patchEntity($user, $data);
        $users->save($user);
    }

Mon problème c'est que rien ne s'enregistre, et je ne sais pas trop comment débuger les tables, entity sous Cake !

7 réponses


connected
Réponse acceptée

Tu n'a pas forcement besoin de patcher un entity, tu peux passer par des set sur un entity

Si tu essaies ce code :

<?php 

public function login(){

    if ($this->request->is('post')) {
        $user = $this->Auth->identify();

        if($user){
            $this->Auth->setUser($user);
            $entity = $this->Users->get($user['id']);
            $entity->set('lastlogin', new Time());
            $entity->set('lastip', $this->request->clientIp());

            $user = $this->Users->save($entity);
            var_dump($user);die();

            return $this->redirect($this->Auth->redirectUrl());
        }
        $this->Flash->error(__("Email ou mot de passe incorrect, essayez à nouveau."));
    }
}

?>

Bonsoir.
C'est normal étant donné que la connexion d'un utilisateur n'entraîne pas de sauvegarde par défaut, mais juste une requête de sélection.
Par contre, la prochaine fois, n'oublies pas de préciser que ton sujet concerne la version 3 de CakePHP et non la version 2.
Tu peux regarder du côté de l'implémentation d'un des nouveaux événements ajouté sur le composant Auth, qui se nomme afterIdentify :

AuthComponent lance maintenant deux événementsAuth.afterIdentify et Auth.logout respectivement après qu’un utilisateur a été identifié et avant qu’un utilisateur ne soit déconnecté. Vous pouvez définir une fonction de callback pour ces événements en retournant un tableau de mapping depuis la méthode implementedEvents() de votre classe d’authentification

Voir : Créer des Objets d’Authentification Personnalisés.

Muxabble
Auteur

okey je check sa et je retourne vers vous, Yep, j'avais zappé la version x)

Edit, si j'ai compris la doc je fait un fichier PersoAuthenticate.php dans src/Auth puis je fais ma function
public function implementedEvents(){
        $userId = $session->read('Auth.User.id');
        $user = $users->get($userId);
        $data = [
            'lastlogin' => '2014-04-12 12:22:30'
        ];
        $users->patchEntity($user, $data);
        $users->save($user);
return [
        'Auth.afterIdentify' => 'afterIdentify',
        'Auth.logout' => 'logout'
    ];
    }
Muxabble
Auteur

Bon, j'ai essayé de faire un p'tit code dans ma fonction login en m'inspirant de Xeta x)

Je suis venu à faire

public function login()
    {

        if ($this->request->is('post')) {
           $userLogin = $this->Auth->identify();

            $userId = $this->Auth->user('id');
            $user->lastlogin = new Time();
            $user->lastip = $this->request->clientIp();

            if($userLogin){
                $this->Auth->setUser($userLogin);
                $user = $this->Users->newEntity($userLogin);
                $user->isNew(false);

                var_dump($this->Users->patchEntity($userId, $user));
                die();
                $this->Users->save($userId);

                var_dump($user);
                return $this->redirect($this->Auth->redirectUrl());
            }
            $this->Flash->error(__("Email ou mot de passe incorrect, essayez à nouveau."));
        }
    }

Pour moi cette fonction est valable, je defini l'ID, je defini mon tableau et enfin je set tout et je save sauf qu'une multitude d'erreur survient ...

Creating default object from empty value Pour le lastlogin
Et des erreurs du style
Argument 1 passed to Cake\ORM\Table::patchEntity() must implement interface Cake\Datasource\EntityInterface, null given, called in /var/www/local.dev/kreers/src/Controller/UsersController.php on line 77 and defined [CORE/src/ORM/Table.php, line 2010]
Ou encore que patchEntity doit être un tableau ... Mais il est un tableau ^^

Bonsoir,

c'est normal ton patchentity a besoin d'une entity, tu lui donne un id en premier paramètre.

Ca donne quoi ce code :

<?php 

public function login(){

    if ($this->request->is('post')) {
        $userLogin = $this->Auth->identify();

        $user = $this->Users->get($this->Auth->user('id'));

        if($userLogin){
            $this->Auth->setUser($user);
            $user->set('lastlogin', new Time());
            $user->set('lastip', $this->request->clientIp());

            $this->Users->save($user);
            var_dump($user);die();

            return $this->redirect($this->Auth->redirectUrl());
        }
        $this->Flash->error(__("Email ou mot de passe incorrect, essayez à nouveau."));
    }
}

?>

Edit : j'ai modifié le setUser par $this->Auth->setUser($user); et il manquait une parenthèse après clientIp();

Muxabble
Auteur

Là je ne vois pas ton patchEntity est-ce normal ?
Ba le code me fou un Record not found in table "users" with primary key [NULL]
Apparement l'ID serait nul !

Muxabble
Auteur

Ah, tiens le fait d'avoir mis l'id en valeur, fait fonctionner le code ! Merci beaucoup de ton aide,