2

last_login_atユーザーが私のWebサイト(Yiiフレームワークで構築されている)にログインするたびに、TIMESTAMPで呼び出されるユーザーモデルのフィールドを更新できるようにしたいと思います。

これはどのように行うことができますか?

actionLogin()SiteController.phpでは何らかの編集が必要だと思います。

4

3 に答える 3

6

オーバーライドしたいのは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);
}
于 2012-06-16T17:47:52.327 に答える
2

あなた自身があなたの質問に答えを与えました、行動の最後の行を見てください。
サイトコントローラのログインアクションで

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));
  }
于 2012-06-17T07:45:24.767 に答える
2

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;
        }
    }
}
于 2012-06-16T10:52:00.053 に答える