Bonjour,
J'ai un petit problème avec le composant Auth de cakePHP.
J'aimerai que quand l'utilisateur connecté modifie son profil,
exemple il modifie son adresse mail, la valeur de email dans la session utilisateur change aussi.
Parce que je la récupère parfois
<?php echo AuthComponent::user('username'); ?>
Voilà j'ai essayé en mettant un
$this->Auth->saveField('email', $d'User']'email']);
juste après avoir fait un
$this->User->save($d,true,array('email','password'));
mais quand j'affiche la session avec
debug($this->Session->read());
c'est encore l'ancienne adresse mail.
Merci d'avance
Cordialement
Désolé prbaron mais je n'arrive pas à mettre en place ta solution...
Wulfkind, oui en reloggant mon user ça fonctionne, mais du coup il me redirige à l'index :
'loginRedirect' => array('controller' => 'pages', 'action' => 'display', 'home'),
vu que c'est l'action prédéfinie lorsqu'on se connecte.
Comment je fais pour que ce login(); spécifiquement celui ci ne me redirige pas, juste recréé la session.
Merci !
EDIT : j'avais pas fait gaffe, mais il me créé une session dans ma session...
'Auth' => array(
'User' => array(
'User' => array(
'password' => ' *****',
'id' => '15',
'username' => 'Monpseudo',
'email' => 'test@free.com',
'is_admin' => '1',
'is_manager' => '1',
'is_active' => '1',
'is_dev' => '1',
'is_qa' => '1',
'ip' => '192.168.1.1',
'show_assigned' => '1',
'show_severity' => '0',
'show_status' => '1',
'show_project' => '0',
'show_description' => '1',
'show_version' => '0',
'show_stopper' => '1',
'page_size' => '20'
)
)
)
Ok j'ai trouvé avec write :
$this->Session->write('Auth.User.email', $d'User']'email']);
Faut bien indiquer
Auth.User.tonChamps
à modifier... sinon il veut pas, bizarre quand même qu'il ne se place pas directement dans ce tableau là...
Bref résolu Merci à tous !
Enfaite j'ai utilisé CakeSession :
$this->Session->write('Auth.User.email', $d'User']'email']);
c'est ce que j'ai écrit à la fin de mon dernier message, le relogin générait un User dans le tableau User déjà existant au lieu de l'écraser.
Merci à tous problème résolu !
save() c'est pour enregistrer au niveau de la base de données. AuthComponent est géré par la session à mon avis. Il est donc normal que ton saveField() ne change rien.
EDIT : Après avoir regardé le code de AuthComponent ( http://api22.cakephp.org/view_source/auth-component#line-556, la gestion est bien faite dans la session. Il va donc falloir que tu joues avec CakeSession pour faire une modification. Pourquoi pas dans un afterSave().
Ok ok, merci pour cette réponse.
Donc genre avec un simple
$this->session->write('email', $d'User']'email']);
ça devrait coller ?
EDIT : Ou pas Fatal error... bref si tu pouvais détaillé un peu plus merci d'avance !
Je vois comment appeller afterSave() avec une condition si je suis sur la page profil dans ce cas je met à jour ma session, le truc c'est que j'arrive pas justement à mettre à jour la session.
J'aurais mis Session au lieu de session. Tu as un composent CakeSession qui fonctionne très bien et qui faire plus de choses qu'une simple écriture dans la session. Il est conseillé d'utiliser les composants de CakePHP dans ces cas là.
http://api22.cakephp.org/class/cake-session#method-CakeSessionwrite.
Dans un premier temps, je te conseille d'analyser comment est définit l'email dans la session. (Je crois que c'est
User =>
'username' => 'xxx',
'email' => 'xxx',
], mais je n'en suis pas sur du tout).
Pour écrire ta fonction afterSave, il faut modifier le bon élément grâce à l'étape du dessus.
public function afterSave($created) {
if($created) {
CakeSession::write("{mettre la bonne clé ici}", $this->data'User']'email']);
}
return true;
}
A mon avis il faut faire quelque chose dans ce genre là.
Et pourquoi pas faire la sauvergarde de la session dans le controller ?
if ($this->User->save()) {
$this->Auth->login($this->User->read());
}
Dans ce genre la quoi.
Bonne chance
Le relogin est un peu la méthode de barbare. Cela inclue des requêtes au serveur qui n'ont pas lieu d'être.
Pourquoi ne pas utiliser le composant CakeSession ?