blackseabreathe
@blackseabreathe
brackets

Modx Revo api как сделать статус онлайн/оффлайн в выборке пользователей?

//выборка
$query = $modx->newQuery('modUser');
$users = $modx->getCollection('modUser', $query);

// цикл по пользователям
foreach ($users as $user) {
$name = $user->get('username');
$uid = $user->get('id');
$isOnline = $modx->getLoginUserName(); //берет текущего пользователя (то есть админа)
if($isOnline){
$status= "Онлайн";
}
else{
$status= "Оффлайн";
}

...
echo '.$status.';
...


}


Пробовал, не помогло:

$isOnline = $user-> isAuthenticated();
$isOnline = $user-> hasSessionContext('web');
  • Вопрос задан
  • 150 просмотров
Решения вопроса 1
alelunegov
@alelunegov
Фрилансер. Разработка сайтов на MODX, верстка
Сергей Миллер, к сожалению в 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;

Вам придется это еще переработать под себя.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы