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