web-dev-qa-db-fra.com

Vérifiez si l'utilisateur est connecté à un thème

Dans Drupal 7, nous pouvons simplement vérifier si l'utilisateur actuel est connecté à un thème en vérifiant $GLOBAL['user']->uid Ou en utilisant user_is_logged_in() =.

Comment puis-je vérifier si un utilisateur est connecté dans un modèle de page, dans Drupal 8?

Une solution consiste à archiver manuellement hook_preprocess_page(), mais comme c'est très populaire, je pense que Drupal fournit quelque chose par défaut pour le Twig moteur de thème.

17
Yusef

Si vous venez de vérifier que l'utilisateur actuel est connecté, vous pouvez utiliser $variables['logged_in'], Qui est généralement disponible dans tous les fichiers de modèle.

Par exemple, le fichier mark.html.twig utilise le code suivant, bien que la seule variable documentée soit 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 %}

La variable est explicitement documentée dans d'autres fichiers de modèle, tels que html.html.twig , page.html.twig , et node.html.twig =.

La variable est disponible dans tous les fichiers de modèle, car elle est initialisée dans _template_preprocess_default_variables() qui appelle user_template_preprocess_default_variables_alter() (une implémentation de hook_template_preprocess_default_variables_alter()) , qui contient le code suivant.

  $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() est appelée par template_preprocess(), qui est la fonction appelée pour les hooks de thème implémentés comme modèles; cela garantit que la variable est disponible dans tous les fichiers de modèle.

Gardez à l'esprit que les macros n'ont pas accès aux variables de modèle actuelles , donc essayer d'accéder à logged_in Dans le code d'une macro n'aurait aucun effet.
Entre les fichiers de modèle utilisés à partir de Drupal modules principaux, ceux utilisant une macro sont:

  • 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 %}
    
  • menu - 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 %}
    

Par exemple, la modification de la dernière macro avec le code suivant n'aurait pas le résultat attendu.

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

Vous pouvez le faire avec le module Twig Extender . Citation de sa page de projet:

Ajoutez un système de plugin simple pour ajouter de nouvelles extensions twig (filtre et fonctions). Fournit un nouveau fournisseur de services pour "twig.extensions" pour ajouter de nouveaux plugins.

Fonction: is_user_logged_in

Vérifiez si l'utilisateur est connecté.

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

Vous pouvez vérifier si l'utilisateur est authentifié comme ceci:

Par exemple, j'ai créé la fonction suivante dans 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;
  }
}

Après cela, vous pouvez créer la logique dans le fichier Twig comme ceci:

<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>

Si l'utilisateur est connecté, vous recevrez le message d'accueil avec le nom d'utilisateur, l'e-mail et la photo d'avatar. Si l'utilisateur n'est pas connecté, rien n'apparaîtra.

Faites-moi savoir si cela aide et/ou si je peux éditer ce message pour une meilleure compréhension.

1
Manuel Abascal

Pour tous ceux qui essaient d'utiliser logged_in À partir de menu.twig.html; vous devez l'appeler depuis l'extérieur de la macro menus.menu_links() car la variable logged_in est hors de portée dans la macro.

1
Freddy Amsterdam