views:

80

answers:

3

I wanna gather the latest information of a user from the User Model and store it in the session.

so i am doing this

// Before Render function beforeRender() {

    if($this->Session->check('Auth.User')) {
        $this->User->recursive = -1;
        $currentUser = $this->User->read(null, $this->Session->read('Auth.User.id'));
        $this->set(compact('currentUser'));
    }

}

It works fine until am in the User model.

When i go to the pages it gives me an error because User->read doesnt work as that model is not attached there.

Whats the best solution for ?

  1. I want the latest information of the Loggedin User on every page of the site.
  2. Latest and not Auth.User from the session because - when i edit the profile content like name or photo. it still references to the old data that was stored when user had logged on.
  3. It has to be displayed on every page like the Stackoverflow User info at the top

alt text

Which is the best way to do it ?

+3  A: 
  1. Create /app/app_controller.php.
  2. In that controller create the beforeRender function.
  3. Use the usual $uses.

See the book.

Adam
cool. i had done everything except $uses. works now. thanks. is this the right way of doing it ?
Harsha M V
Yes, as the documentation says "It is the ideal place to create code that is common to all of your controllers." But you may try `beforeFileter` instead of `beforeRender`. See the doc for that: http://book.cakephp.org/view/977/Controller-Methods#Callbacks-984
Adam
Also in the beforeFilter you can load all your security settings and in all your controllers you will have $this->Auth->user()
Nik
I would be more tempted to use `bindModel()` instead of $uses
DavidYell
+1  A: 

You can try to load the model in your beforeRender like this: $this->load('User'), this should load the model for you in every controller. http://book.cakephp.org/view/992/loadModel

Tim
+1  A: 

The other suggestions seem to be adding a bit of overhead to your application (by loading and querying the User model for each request). Have you considered simply updating the stale session data when updates occur to your User model?

<?php
class UsersController extends AppController {
    public function edit() {
        $userId = $this->Session->read('Auth.User.id');
        // populate form
        if (!$this->data) {
            $this->data = $this->User->read($userId, null);
            return;
        }
        // update user
        $saved = $this->User->save($this->data);
        if ($saved) {
            $user = $this->User->read(null, $this->User->id);
            $this->Session->write('Auth.User', $user['User']); // update session
            $this->Session->setFlash('Account details have been updated');
            return $this->redirect(array('action' => 'profile'));
        }
        $this->Session->setFlash('Please correct the validation errors below');
    }
}
?>

This means the data you need will be gathered each request without any additional queries (either from disk if using php or cake session storage, or in a single session query if using database storage).

deizel