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;
}
}
如何获取所有登录的网络用户(或管理员,但不是所有类型)的数量。 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;
}
}