每当用户登录我的网站(使用 Yii 框架构建)时,我希望能够更新我的用户模型last_login_at
中使用 TIMESTAMP 调用的字段。
如何才能做到这一点?
我想actionLogin()
SiteController.php 中需要某种类型的编辑。
您要覆盖的是CWebUser::afterLogin
方法,它应该是这样的:
protected function afterLogin($fromCookie) {
if (!$fromCookie) { #User Explicitly logged in
$user = $this->model;
$user->saveAttributes(array('last_login_at' => date(DateTime::W3C)));
}
return parent::afterLogin($fromCookie);
}
您自己在问题中给出了答案,请参阅最后一行。
在您的站点控制器登录操作中
public function actionLogin()
{
$model=new LoginForm;
// if it is ajax validation request
if(isset($_POST['ajax']) && $_POST['ajax']==='login-form')
{
echo CActiveForm::validate($model);
Yii::app()->end();
}
// collect user input data
if(isset($_POST['LoginForm']))
{
$model->attributes=$_POST['LoginForm'];
// validate user input and redirect to the previous page if valid
if($model->validate() && $model->login())
$userid=Yii::app()->user->id;//to get user id
$timestamp=date('Y-m-d H:i:s');//current time stamp
User::model()->updateByPk($userid, array('last_login_time' =>$timestamp));//hope last_login_time field in user table
$this->redirect(Yii::app()->user->returnUrl);
//$this->redirect(array('loginsuccess'));
}
// display the login form
$this->render('login',array('model'=>$model));
}
身份验证发生在调用 UserIdentity::authenticate() 时。
class UserIdentity extends CUserIdentity
{
private $_id;
public function authenticate()
{
$user = User::model()->findByAttributes(array('username' => $this->username));
if ($user === null) {
$this->errorCode = self::ERROR_USERNAME_INVALID;
} else if ($user->password !== $user->encrypt($this->password)) {
$this->errorCode = self::ERROR_PASSWORD_INVALID;
} else {
$this->_id = $user->id;
if (null === $user->last_login_at) {
$lastLogin = time();
} else {
$lastLogin = strtotime($user->last_login_at);
}
$this->setState('lastLoginAt', $lastLogin);
$this->errorCode = self::ERROR_NONE;
}
return !$this->errorCode;
}
public function getId()
{
return $this->_id;
}
}
现在 lastLoginAt 在您的会话中。下一个问题是“我怎样才能得到这个值?”。这就是答案。这是我用来显示 lastLoginAt 的代码
'lastLoginAt' => Yii::app()->user->isGuest ?
null :
date('l, F d, Y, g:i a', Yii::app()->user->lastLoginAt)
链接这个:
public function actionIndex()
{
// renders the view file 'protected/views/site/index.php'
// using the default layout 'protected/views/layouts/main.php'
$this->render('index', array(
'lastLoginAt' => Yii::app()->user->isGuest ?
null :
date('l, F d, Y, g:i a', Yii::app()->user->lastLoginAt)
));
}
此外,您希望将此值保存在数据库中。因此,尝试使用以下方法更改 LoginForm 类:
User::model()->updateByPk($this->_identity->id, array(
'last_login_at' => new CDbExpression('NOW()')
));
以这种方式使用此代码段:
class LoginForm extends CFormModel
{
public function login()
{
if ($this->_identity === null) {
$this->_identity = new UserIdentity($this->username, $this->password);
$this->_identity->authenticate();
}
if ($this->_identity->errorCode === UserIdentity::ERROR_NONE) {
$duration = $this->rememberMe ? 3600 * 24 * 30 : 0; // 30 days
Yii::app()->user->login($this->_identity, $duration);
User::model()->updateByPk($this->_identity->id, array(
'last_login_at' => new CDbExpression('NOW()')
));
return true;
} else {
return false;
}
}
}