last_login_at
ユーザーが私のWebサイト(Yiiフレームワークで構築されている)にログインするたびに、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;
}
}
}