【问题标题】:How to view a user's status (online, absent, offline)?如何查看用户的状态(在线、缺席、离线)?
【发布时间】:2018-12-03 23:03:29
【问题描述】:

我想在 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;
}

【问题讨论】:

  • 据我所知,没有内置功能(而且我找不到可以做到这一点的模块),因此您将不得不创建自己的模块。您的模块可能会查询数据库的会话表以获取您需要的信息。
  • @2pha 我更新了我的问题
  • 您应该在 5/10 分钟写入警报框/自动刷新,并将会话时间保存在表格中。您将需要比较时间并相应地显示。

标签: php drupal twig drupal-modules drupal-8


【解决方案1】:

试试这个方法,你不必参与会话。由于 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';
  }

【讨论】:

    猜你喜欢
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多