php - 如何查看用户的状态(在线、缺席、离线)?
问题描述
我想在 Drupal 8 上获取用户的状态。
使用下面的代码,如果用户在线,则状态为在线。但是如果用户已经离线超过一个小时,状态就会丢失。通常它应该是离线的。
这段代码有什么问题?
谢谢
这是我在user.html.twig
文件中添加的内容:
<div class="bs-field-status">
{% if status == 'Online' %}
<i class="user-online fa fa-circle fa-lg"></i> Online
{% elseif status == 'Absent' %}
<i class="user-absent fa fa-circle fa-lg"></i> Absent
{% else %}
<i class="user-offline fa fa-circle fa-lg"></i> Offline
{% endif %}
</div>
bootstrap_sub.theme
:
<?php
/**
* @file
* Bootstrap sub-theme.
*
* Place your custom PHP code in this file.
*/
use Drupal\Core\Database\Database;
/**
* Implements hook_entity_presave().
*/
function bootstrap_sub_preprocess_user(&$variables) {
// get user object
$user = $variables['elements']['#user'];
//- The user has logged in at least once
if ($user->getLastLoginTime()) {
if (account_is_logged_in_less_then_thirty_minutes($user->id())) {
$status = 'Online';
}
else {
$status = 'Absent';
}
}
else {
$status = 'Offline';
}
$variables['status'] = $status;
}
/**
* @param $uid
*
* @return bool
*/
function account_is_logged_in_less_then_thirty_minutes($uid) {
$connection = Database::getConnection();
$query = $connection->select('sessions', 'sessions')
->fields('sessions', ['sid', 'uid', 'timestamp'])
->condition('sessions.uid', $uid, '=')
//- chef if the user was online in 30 minutes (60 * 30)
->condition('sessions.timestamp', \Drupal::time()
->getRequestTime() - (60 * 30), '>')
->execute();
//- Get result.
$results = $query->fetchAll(\PDO::FETCH_OBJ);
return (count($results) > 0) ? TRUE : FALSE;
}
解决方案
试试这个方法,你不必参与会话。由于 Drupal 用户对象提供了 getLastAccessedTime() 方法,它可以为您解决问题。
$userLastAccessTime = $user->getLastAccessedTime();
$unixTime20MinBeforeNow = strtotime("-20 Minutes");
$unixTime1HourBeforeNow = strtotime("-1 Hours");
/*
* User last access time is more than last 10 minutes.
* User was actve withing last 30 minutes.
*/
if ($userLastAccessTime > $unixTime20MinBeforeNow) {
$status = 'Online';
} else if ($userLastAccessTime > $unixTime1HourBeforeNow) {
$status = 'Absent';
} else {
$status = 'Offline';
}
推荐阅读
- c# - C# uniquUE 中的 AES 解密
- python - 用字典在熊猫中的列到行?
- python - Python 中的 Dialogflow API 访问后续意图
- django - 将 pydub 与 AWS 存储的文件一起使用
- spring - Eureka Server 在 Spring Boot 中给出 Whitelabel Error Page 错误
- laravel - 图库图像未在数据库中更新
- octave - 我可以调用一个函数来解决不同的变量吗?
- sas - 循环在这段代码中是如何工作的?为什么调用执行在没有循环结束的情况下工作?
- html - 即使在显式配置 Content-Type 之后,Perl CGI 脚本也会输出原始 HTML
- python - 写入 D 上的文件时权限被拒绝错误:在 Python 中