Сергей Миллер, к сожалению в MODX нет решения «из коробки» для показа онлайн ли пользователь. Так как у Вас желание сделать именно через API, а не сторонними дополнениями (UsersOnline), то придется постараться. Для начала надо определить, что значить «пользователь онлайн»? Ведь могут быть различные варианты поведения. Пользователь открыл страницу сайта и отошел от компьютера, не закрывая браузера, или переключился на другую вкладку. Он онлайн? Или открыл страницу и сразу закрыл браузер, как узнать что он уже не онлайн. Самый простой и наверное самый распространенный способ, это хранить в базе данных точное время последней загрузки любой страницы пользователем и считать, что если это произошло недавно (минут 5 или 10 назад), то пользователь еще активен.
Для этого создадим плагин, например
userLastAction и подключим ему системное событие
OnLoadWebDocument (код отчасти взят
у Василия Наумкина):
<?php
switch ($modx->event->name) {
case 'OnLoadWebDocument':
// Сохраняем дату открытия любой страницы сайта, если пользователь авторизован
if ($modx->user->isAuthenticated($modx->context->key)) {
// Здесь мы работаем с текущим пользователем — у него профиль уже загружен
$profile = $modx->user->Profile;
// Сохраняем дату и время в поле факс (а зачем еще это поле?) профиля пользователя
$profile->set('fax', date('Y-m-d H:i:s'));
$profile->save();
}
break;
}
Теперь при открытии любой страницы сайта любым пользователем будет сохранятся точное время этого действия, привязанное к профилю пользователя. Остается только при формировании списка проверять, давно ли он пользователь совершал действие на сайте.
Я например писал такой сниппет
userOnline:
<?php
$output = '';
// Если есть ID пользователя
if ($input) {
$userId = (int)$input;
// Если в параметрах не установлено через какое количество секунд считать пользователя "офлайн", то берем 10 минут
$idleTime = $options ? (int)$options : 600;
// Получаем объект пользователя по ID
$user = $modx->getObject('modUser', $userId);
if (!empty($user)) { // Если пользователь существует, то...
// Получаем его профиль
$profile = $user->getOne('Profile');
// Получаем время его последнего действия
$userLastAction = $profile->get('fax');
if (!empty($userLastAction)) {
// Если есть время в базе, то проверяем меньше ли оно установленного нами времени признания пользователя активным
if (date('U') - date('U', strtotime($userLastAction)) < $idleTime) {
// Если да, будем выводить слово "online"
$output = 'online';
} else {
// Если нет, то — время его последнего действия
$output = $userLastAction;
}
}
}
}
// Выводим результат
return $output;
Вам придется это еще переработать под себя.