2012-12-07 59 views
0

在我看來,我試圖顯示已登錄的用戶信息的當前和想通我可以做到這一點通過使用CakePHP中驗證用戶信息

echo "Welcome back " .$this->Session->read('Auth.User.username'). " 

這將顯示用戶名,我可以使用相同的方法來顯示該數據庫行中的其他字段,但是某些其他字段可以隨時更新,但在用戶頁面上不更新,直到他們註銷並再次登錄。

這是正確的方法嗎?或者可以做到這一點更好的方式,並以某種方式在AppController的beforeFilter()中放置一些代碼,以繼續更新每個頁面加載的變量?

+1

你也應該使用H()周圍,以確保HTML。 – mark

回答

0

我寧願獲得實時數據,而不是會話數據的

var $uses = array('User'); 

function beforeFilter(){ 
    $id = $this->Auth->user('id'); //Using the session's user id is fine because it doesn't change/update 
    $user_data = $this->User->findById($id); 
    $user_fname = $user_data['User']['fname']; 
    $this->set('fname', $user_fname); 
} 

//In your view 
echo 'Welcome Back '. $fname . '!'; 
+0

這看起來很完美,但我得到以下錯誤 - 調用成員函數findById()對象 – medoix

+0

我更新了答案,將用戶模型包含在appController中。 –

+0

@TimJoyce,你爲什麼更喜歡得到實時數據,而不是會話,你能解釋一下嗎? – mgPePe

0

如果你只是對用戶模型進行的afterSave(),並在其中設置$this->Session->write('Auth.User') = $user;

這是不可測試,但看起來它應該工作 - 那麼你的會議將永遠是最新的任何變化。

編輯:

根據您的評論,如果數據被從您沒有訪問第三方源拉,你需要確保它的更新在每個頁面加載,那麼是的,AppController的beforeFilter()就好了。

但是,如果您只需要某些頁面或特定元素,那麼您可以調用update,或者通過元素的requestAction。

+0

我看到的問題(還沒有測試)是通過這個應用程序沒有改變數據,數據庫從另一個應用程序更新,這個解決方案,我假設只有在cakephp表格保存後更新它... – medoix

+0

@medoix - 那會在你的問題中一直值得一提。 – Dave

1

如果數據庫從CakePHP外部更新並且沒有調用任何控制器動作,似乎唯一的解決方案是在每個加載的頁面上查詢以獲取當前值。

對於這一點,你應該在AppController中使用beforeFilter方法:

function beforeFilter(){ 
    $user = $this->User->field('name', array('User.id' => $this->Session->read('Auth.User.id'))); 
    $this->Session->write('Auth.User', $user); 
} 

否則,您可以使用JavaScript和AJAX到數據獲取不時。

+0

也可以做的伎倆,但我得到 - 致命錯誤:調用一個非對象的成員函數字段()在 – medoix

+0

你必須包括你想使用的模型在AppController與'$ uses'變量作爲詳細的CakePHP文檔http://book.cakephp.org/2.0/en/controllers.html#Controller:$$uses – Alvaro