ModX Revo:获取当前 Webuser 或 Manager 会话

ModX Revo: Get Current Webuser or Manager session

如何获取所有登录的网络用户(或管理员,但不是所有类型)的数量。 ModX API 有可能吗?或者是否有必要检查数据库 table modx_session - 但是 "data" 列如何可读?

我想显示在线用户计数器(例如在论坛中)。

查看 https://github.com/modxcms/revolution/blob/master/manager/controllers/default/dashboard/widget.grid-online.php 中的代码 - 这就是您想要的。

我会尽量自己解决。解决方案种类:

编写一个跟踪事件并将其保存在数据库或其他地方的插件:OnWebLogin 和 OnWebLogout。然后读取登录用户数。

创建了一个数据库 table "modx_weblogin_session"(手动)用户 ID、时间戳。

创建了一个插件:

if (isset($modx) && isset($user)) {
$eventName = $modx->event->name;
$isBackend = ($modx->context->key == 'mgr') ? true : false;

$errorMsg = '';

$userId = $user->get('id');
$output = 'WebLoginCountSession-Plugin: ' . $eventName . ' user-id: ' . $userId;

$logout = function ($userId) {
    global $modx;
    //Custom Mysqli Class
    if (MySQLiDB::isConnected()) {
        $mysqli = MySQLiDB::getConnection();
        if ($mysqli instanceof mysqli) {
            try {
                $sql = "DELETE FROM `modx_weblogin_session` WHERE userid = ?";
                $prep_state = $mysqli->prepare($sql);
                $prep_state->bind_param('i', $userId);
                $prep_state->execute();
            } catch (Exception $e) {
            //$modx->log(modX::LOG_LEVEL_ERROR, ...)
            }
        }
    }
};

$login = function ($userId) {
    global $modx;
    if (MySQLiDB::isConnected()) {
        $mysqli = MySQLiDB::getConnection();
        if ($mysqli instanceof mysqli) {
            try {
                $sql = "REPLACE INTO `modx_weblogin_session` (`userid`) VALUES (?)";
                $prep_state = $mysqli->prepare($sql);
                $prep_state->bind_param('i', $userId);
                $prep_state->execute();
            } catch (Exception $e) {
             //$modx->log(modX::LOG_LEVEL_ERROR, ...)
            }
        }
    }
};

if (!$isBackend && !empty($userId)) {
    switch ($eventName) {
        case ('OnWebLogin'):
            $output .= ' - login';
            $login($userId);
            break;
        case ('OnWebLogout'):
            $output .= ' - logout';
            $logout($userId);
            break;
    }
}

if ($debug === true) {
    return $output . ' ' . $errorMsg;
}

}