Перевірте, чи користувач увійшов у тему


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 %}
  • book-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 %}
  • меню - панель інструментів.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 це працює.
Без розмивання

_template_preprocess_default_variables()викликається для кожного виводу шаблону Drupal, тому змінні, які він додає, є у всіх файлах шаблонів. Наскільки я бачу, документація не документує всіх змінних за замовчуванням.
kiamlaluno

2
@kiamlaluno, коли у вас є вільний час, спробуйте {% if logged_in %}меню.html.twig, і ви побачите, що це не працює. Не працювало для мене.
Без зачистки

6

Можна за допомогою модуля Twig Extender . Цитата зі сторінки проекту:

Додайте просту систему плагінів, щоб додати нові розширення гілочок (Фільтр та функції). Надає нового постачальника послуг для "twig.extensions" для додавання нових плагінів.

Функція: is_user_logged_in

Перевірте, чи користувач увійшов у систему.

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

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

2
Для цього функціоналу не потрібен модуль, оскільки ядро ​​Drupal вже має його. Дивіться мою відповідь.
kiamlaluno

@kiamlaluno Так, я згоден з вами, ця вимога дуже популярна, і я був впевнений, що drupal щось для цього забезпечив.
Юзеф

1

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


1

Ви можете перевірити, чи користувач аутентифікований так:

Наприклад, я створив таку функцію в topicname.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.