If statement 如果用户在线或离线,如何使用细枝显示?

If statement 如果用户在线或离线,如何使用细枝显示?,if-statement,drupal,twig,drupal-8,If Statement,Drupal,Twig,Drupal 8,在我的Drupal8站点上,我想在用户的模板中添加一个代码来显示他的在线、缺席或离线状态 我只想用TWIG实现这一点,而不需要创建自定义模块 在这种情况下,如何计算用户的上次访问和当前时间 以下是我想提出的条件: 如果用户访问该网站的时间少于15分钟,则表示该用户处于在线状态 否则,如果用户访问该站点的时间超过15分钟,但不到30分钟,则该用户将缺席 否则它是离线的 user-full.html.twig: {% if ??? %} <div class="mt-2 text-

在我的Drupal8站点上,我想在用户的模板中添加一个代码来显示他的在线、缺席或离线状态

我只想用TWIG实现这一点,而不需要创建自定义模块

在这种情况下,如何计算用户的上次访问和当前时间

以下是我想提出的条件:

如果用户访问该网站的时间少于15分钟,则表示该用户处于在线状态

否则,如果用户访问该站点的时间超过15分钟,但不到30分钟,则该用户将缺席

否则它是离线的

user-full.html.twig:

  {% if ??? %}
    <div class="mt-2 text-center font-weight-bold font-italic text-success">
      <i class="fa fa-circle fa-lg"></i> Online
    </div>
  {% elseif ??? %}
    <div class="mt-2 text-center font-weight-bold font-italic text-warning">
      <i class="fa fa-circle fa-lg"></i> Absent
    </div>
  {% else %}
    <div class="mt-2 text-center font-weight-bold font-italic text-danger">
      <i class="fa fa-circle fa-lg"></i> Offline
    </div>
  {% endif %}
以下代码显示当前时间戳:

{{ 'now'|date('U') }}
如何计算和显示正确的状态

更新2

答案是有效的,以下是操作的结果:

{{ date().timestamp }}
{{ user.access.value }}
{{ (date().timestamp - user.access.value) }}
但是有一个问题,如果我重新加载页面,数字永远不会改变。要更新它,我必须清空缓存

  {% if (date().timestamp - user.access.value) < 900 %}
    <div class="mt-2 text-center font-weight-bold font-italic text-success">
      <i class="fa fa-circle fa-lg"></i> Online
    </div>
  {% elseif (date().timestamp - user.access.value) < 1800 %}
    <div class="mt-2 text-center font-weight-bold font-italic text-warning">
      <i class="fa fa-circle fa-lg"></i> Absent
    </div>
  {% else %}
    <div class="mt-2 text-center font-weight-bold font-italic text-danger">
      <i class="fa fa-circle fa-lg"></i> Offline
    </div>
  {% endif %}
user.access.value以秒为单位保存时间戳,因此您可以尝试以下操作:

  {% set elapsed = date().timestamp - user.access.value %}}      

  {% if elapsed < 15*60 %}
    <div class="mt-2 text-center font-weight-bold font-italic text-success">
      <i class="fa fa-circle fa-lg"></i> Online
    </div>
  {% elseif elapsed < 30*60 %}
    <div class="mt-2 text-center font-weight-bold font-italic text-warning">
      <i class="fa fa-circle fa-lg"></i> Absent
    </div>
  {% else %}
    <div class="mt-2 text-center font-weight-bold font-italic text-danger">
      <i class="fa fa-circle fa-lg"></i> Offline
    </div>
  {% endif %}

这回答了你的问题吗?这些页面被缓存。您可能需要在预处理函数cache max age:0中设置缓存类型,以禁用这些页面上的缓存。如果是我,我也会在预处理函数中对用户状态进行逻辑处理,然后将变量发送到模板。@2pha我们可以为日期停用缓存吗?我不知道如何做预处理,我想避免制作个性化模块我不理解上面的评论。在预处理中,您使用的是PHP,而不是呈现的HTML。我认为可以通过使用预处理页面并设置$variables['cache']['max-age']=0,将整个页面设置为不缓存;我发现这似乎很相似。回答问题的人之一创建了一个模块,该模块通过使用javascript注入状态来绕过缓存问题。不过,该模块可以通过使用一个通过bigpipe加载的自定义块来简化,不过可能会有所帮助。谢谢,这会更好。我进行了测试,但用户从未脱机。您确定获得了正确的用户变量吗?该代码有效,如果自上次用户访问以来已过30分钟,它将进入相应的条件块。脱机时不起作用。这两个变量显示的值与屏幕截图中显示的值相同。这对我很有用。我猜你的模板在这里得到了错误的用户变量,即。用户可能只是当前用户,而不是那些ie。与每个用户配置文件对应的迭代中的用户,可能会填充你的模板。我已经更新了我的问题**更新2**问题是当前日期的缓存。
/**
 * User online status.
 */
function bootstrap_subtheme_front_office_old_preprocess_block(&$variables) {
  if ($variables['plugin_id'] == 'block_id') {
    $variables['#cache']['max-age'] = 0;
  }
}
  {% set elapsed = date().timestamp - user.access.value %}}      

  {% if elapsed < 15*60 %}
    <div class="mt-2 text-center font-weight-bold font-italic text-success">
      <i class="fa fa-circle fa-lg"></i> Online
    </div>
  {% elseif elapsed < 30*60 %}
    <div class="mt-2 text-center font-weight-bold font-italic text-warning">
      <i class="fa fa-circle fa-lg"></i> Absent
    </div>
  {% else %}
    <div class="mt-2 text-center font-weight-bold font-italic text-danger">
      <i class="fa fa-circle fa-lg"></i> Offline
    </div>
  {% endif %}