Проверьте, вошел ли пользователь в тему


16

В Drupal 7 мы можем просто проверить, вошел ли текущий пользователь в тему, проверив $GLOBAL['user']->uidили используя user_is_logged_in().

Как я могу проверить, вошел ли пользователь в шаблон страницы, в Drupal 8?

Решение состоит в том, чтобы зарегистрироваться вручную hook_preprocess_page(), но так как это очень популярно, я думаю, что Drupal предоставляет что-то по умолчанию для движка тем Twig.

Ответы:


26

Если вы просто проверяете, что текущий пользователь вошел в систему, вы можете использовать его $variables['logged_in'], что обычно доступно во всех файлах шаблона.

Например, файл mark.html.twig использует следующий код, хотя единственной документированной переменной является status.

{% if logged_in %}
  {% if status is constant('MARK_NEW') %}
    <span class="marker">{{ 'New'|t }}</span>
  {% elseif status is constant('MARK_UPDATED') %}
    <span class="marker">{{ 'Updated'|t }}</span>
  {% endif %}
{% endif %}

Переменная явно задокументирована в других файлах шаблонов, таких как html.html.twig , page.html.twig и node.html.twig .

Переменная доступна во всех файлах шаблона, так как она инициализируется при _template_preprocess_default_variables()этом user_template_preprocess_default_variables_alter()(реализация hook_template_preprocess_default_variables_alter()), которая содержит следующий код.

  $user = \Drupal::currentUser();

  $variables['user'] = clone $user;
  // Remove password and session IDs, since themes should not need nor see them.
  unset($variables['user']->pass, $variables['user']->sid, $variables['user']->ssid);

  $variables['is_admin'] = $user->hasPermission('access administration pages');
  $variables['logged_in'] = $user->isAuthenticated();

_template_preprocess_default_variables() называется template_preprocess() помощью функции, вызываемой для ловушек тем, реализованных в виде шаблонов; это гарантирует, что переменная доступна во всех файлах шаблона.

Имейте в виду, что у макросов нет доступа к текущим переменным шаблона , поэтому попытка доступа logged_inв коде макроса не будет иметь никакого эффекта.
Между файлами шаблонов, используемыми из основных модулей Drupal, используются макросы:

  • menu.html.twig

    {% macro menu_links(items, attributes, menu_level) %}
      {% import _self as menus %}
      {% if items %}
        {% if menu_level == 0 %}
          <ul{{ attributes }}>
        {% else %}
          <ul>
        {% endif %}
        {% for item in items %}
          <li{{ item.attributes }}>
            {{ link(item.title, item.url) }}
            {% if item.below %}
              {{ menus.menu_links(item.below, attributes, menu_level + 1) }}
            {% endif %}
          </li>
        {% endfor %}
        </ul>
      {% endif %}
    {% endmacro %}
  • Книга-tree.html.twig

    {% macro book_links(items, attributes, menu_level) %}
      {% import _self as book_tree %}
      {% if items %}
        {% if menu_level == 0 %}
          <ul{{ attributes }}>
        {% else %}
          <ul>
        {% endif %}
        {% for item in items %}
          <li{{ item.attributes }}>
            {{ link(item.title, item.url) }}
            {% if item.below %}
              {{ book_tree.book_links(item.below, attributes, menu_level + 1) }}
            {% endif %}
          </li>
        {% endfor %}
        </ul>
      {% endif %}
    {% endmacro %}
  • Меню - toolbar.html.twig

    {% macro menu_links(items, attributes, menu_level) %}
      {% import _self as menus %}
      {% if items %}
        {% if menu_level == 0 %}
          <ul{{ attributes.addClass('toolbar-menu') }}>
        {% else %}
          <ul class="toolbar-menu">
        {% endif %}
        {% for item in items %}
          {%
            set classes = [
              'menu-item',
              item.is_expanded ? 'menu-item--expanded',
              item.is_collapsed ? 'menu-item--collapsed',
              item.in_active_trail ? 'menu-item--active-trail',
            ]
          %}
          <li{{ item.attributes.addClass(classes) }}>
            {{ link(item.title, item.url) }}
            {% if item.below %}
              {{ menus.menu_links(item.below, attributes, menu_level + 1) }}
            {% endif %}
          </li>
        {% endfor %}
        </ul>
      {% endif %}
    {% endmacro %}

Например, изменение последнего макроса с помощью следующего кода не приведет к ожидаемому результату.

{% macro menu_links(items, attributes, menu_level) %}
  {% import _self as menus %}
  {% if items %}
    {% if menu_level == 0 %}
      <ul{{ attributes.addClass('toolbar-menu') }}>
    {% else %}
      <ul class="toolbar-menu">
    {% endif %}
    {% for item in items %}
      {%
        set classes = [
          'menu-item',
          logged_in ? 'menu-item--logged-in-user',
          item.is_expanded ? 'menu-item--expanded',
          item.is_collapsed ? 'menu-item--collapsed',
          item.in_active_trail ? 'menu-item--active-trail',
        ]
      %}
      <li{{ item.attributes.addClass(classes) }}>
        {{ link(item.title, item.url) }}
        {% if item.below %}
          {{ menus.menu_links(item.below, attributes, menu_level + 1) }}
        {% endif %}
      </li>
    {% endfor %}
    </ul>
  {% endif %}
{% endmacro %}

The variable is surely available in all the template filesБоюсь, вы ошибаетесь в этом. Если шаблон не упоминает об этом в комментариях, должна быть причина, верно? Потому что я попробовал на menu.html.twig (который не упоминает об этом в комментариях) и не работал. При использовании Twig Extender это работает.
Нет Sssweat

_template_preprocess_default_variables()вызывается для каждого шаблона Drupal, поэтому добавляемые переменные присутствуют во всех файлах шаблона. Документация не документирует все переменные по умолчанию, насколько я могу видеть.
kiamlaluno

2
@kiamlaluno, когда у вас есть свободное время, попробуйте {% if logged_in %}menu.html.twig, и вы увидите, что оно не работает. Не работал для меня
Нет Sssweat

6

Вы можете с помощью модуля Twig Extender . Цитата со страницы проекта:

Добавьте простую систему плагинов для добавления новых расширений веток (Filter and Functions). Предоставляет нового поставщика услуг для «twig.extensions» для добавления новых плагинов.

Функция: is_user_logged_in

Проверьте, вошел ли пользователь в систему.

{% if user_is_logged_in() %}
Hello user
{% else %}
Please login
{% endif %}

используйте только 57 и бета :(. может быть, лучшее решение - это `$ vars ['is_login'] =! \ Drupal :: currentUser () -> isAnonymous ();` in preprocess_page? как вы думаете?
Юсеф

2
Для этой функциональности модуль не нужен, поскольку в ядре Drupal он уже есть. Смотри мой ответ.
kiamlaluno

@kiamlaluno Да, я согласен с вами, это требование очень популярно, и я был уверен, что drupal что-то ему предоставил.
Юсеф

1

Для всех, кто пытается использовать logged_inиз menu.twig.html; Вы должны вызывать его извне menus.menu_links()макроса, так как logged_inпеременная находится вне области действия макроса.


1

Вы можете проверить подлинность пользователя следующим образом:

Например, я создал следующую функцию в themename.theme.

# Function to get user logged info
function tropical_preprocess_page(&$variables){
  // if user is authenticated
  if($variables['user']->isAuthenticated()){
    # gets username
  $user_logged_in_name = $variables['user']->getDisplayName();
  # creates value to ouput in the DOM & capitalize first letter
  $variables['user_logged_in_name'] = ucfirst($user_logged_in_name);

  # gets user email
  $user_email = $variables['user']->getEmail();
  $variables['user_email'] = $user_email;

  // get user picture
  $user = \Drupal\user\Entity\User::load(\Drupal::currentUser()->id());
  $variables['user_picture'] = $user->get('user_picture')->entity->url();

  // Check if user is logged in
  $user_logged = $variables['user']->isAuthenticated();
  $variables['user_logged'] = $user_logged;
  }
}

После этого вы можете создать логику в файле Twig следующим образом:

<div class="user-logged-greeting">
  {% if user_logged %}
    <h2>Welcome back, {{ user_logged_in_name }}!</h2>
    <p>The email for this user is: <strong>{{ user_email }}<strong></p>
    <img src="{{ user_picture }}" width="50" height="50">
  {% endif %}
</div>

Если пользователь вошел в систему, вы получите приветственное сообщение вместе с именем пользователя, электронной почтой и аватаркой. Если пользователь не вошел в систему, он ничего не отобразит.

Дайте мне знать, если это поможет и / или я могу отредактировать этот пост для лучшего понимания.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.