Как отобразить с помощью TWIG, если пользователь онлайн или оффлайн? - PullRequest
0 голосов
/ 20 января 2020

На моем сайте Drupal 8 я хочу поместить код в шаблон пользователя, чтобы отобразить его статус (онлайн, отсутствует или оффлайн).

Я хочу сделать это только с TWIG, без создания пользовательских модуль.

В каких условиях, как тогда рассчитать последний доступ пользователя и текущее время?

https://docs.w3cub.com/drupal~8/core-lib-drupal-core-session-usersession.php/function/usersession-getlastaccessedtime/8.1.x/

Вот что я хочу поставить в условие:

  • Если пользователь зашел на сайт менее чем за 15 минут, он в сети.

  • В противном случае Если пользователь заходил на сайт более 15 минут и менее 30 минут, он отсутствует.

  • В противном случае он не работает.

пользователь - полный. 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 %}

ОБНОВЛЕНИЕ 1

Следующий код отображает «метку времени» последнего доступа:

{{ user.access.value }}

Следующий код отображает текущую «временную метку»:

{{ 'now'|date('U') }}

Как рассчитать и отобразить правильный статус?

https://twig.symfony.com/doc/3.x/templates.html#math

enter image description here

ОБНОВЛЕНИЕ 2

Ответ работает, вот результат операция:

{{ date().timestamp }}
{{ user.access.value }}
{{ (date().timestamp - user.access.value) }}

enter image description here

Но возникает проблема, если я перезагружаю страницу, номер никогда не меняется. Чтобы обновить его, я должен очистить кеш.

  {% 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 %}

ОБНОВЛЕНИЕ 3

В настоящее время я использую представление с EVA и кеш представления отключен.

Я хочу воспроизвести то же поведение непосредственно в TWIG. Код ответа работает, но я хочу отключить кэш для элемента статуса пользователя (онлайн, отсутствует, оффлайн).

enter image description here

enter image description here

enter image description here

Я добавил приведенный ниже код в файл bootstrap_subtheme_front_office_old.theme моей подтемы.

It не правильно, как нацелиться только на код статуса?

/**
 * User online status.
 */
function bootstrap_subtheme_front_office_old_preprocess_block(&$variables) {
  if ($variables['plugin_id'] == 'block_id') {
    $variables['#cache']['max-age'] = 0;
  }
}

1 Ответ

1 голос
/ 20 января 2020

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 %}
...