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

16

Dans Drupal 7, nous pouvons simplement vérifier si l'utilisateur actuel est connecté à un thème en vérifiant $GLOBAL['user']->uidou 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 à s'enregistrer manuellement hook_preprocess_page(), mais comme c'est très populaire, je pense que Drupal fournit quelque chose par défaut pour le moteur de thème Twig.

Yusef
la source

Réponses:

26

Si vous venez de vérifier que l'utilisateur actuel est connecté, vous pouvez l'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()celui invoque 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é par template_preprocess(), qui est la fonction appelée pour les crochets de thème implémentés en tant que 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_inau code d'une macro n'aurait aucun effet.
Entre les fichiers de modèle utilisés à partir des modules principaux de Drupal, 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 %}
kiamlaluno
la source
The variable is surely available in all the template filesJe crains que vous vous trompiez à ce sujet. Si le modèle ne le mentionne pas dans les commentaires, il doit y avoir une raison, non? Parce que j'ai essayé sur menu.html.twig (qui ne le mentionne pas dans les commentaires) et n'a pas fonctionné. Lorsque vous utilisez Twig Extender, cela fonctionne.
Pas de Sssweat du
_template_preprocess_default_variables()est appelé pour chaque modèle de sortie Drupal, donc les variables qu'il ajoute sont présentes dans tous les fichiers de modèle. La documentation ne documente pas toutes les variables par défaut, pour autant que je puisse voir.
kiamlaluno
2
@kiamlaluno chaque fois que vous avez du temps libre, essayez {% if logged_in %}menu.html.twig et vous verrez que cela ne fonctionne pas. Ça n'a pas marché pour moi.
No Sssweat
6

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

Ajoutez un système de plugin simple pour ajouter de nouvelles extensions de brindilles (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 %}
Pas de sueur
la source
seulement 57 utilisent et beta :(. peut-être que la meilleure solution est `$ vars ['is_login'] =! \ Drupal :: currentUser () -> isAnonymous ();` dans preprocess_page? quelle est votre opinion?
Yusef
2
Il n'y a pas besoin d'un module pour cette fonctionnalité, car Drupal core l'a déjà. Voir ma réponse.
kiamlaluno
@kiamlaluno Oui, je suis d'accord avec vous, cette exigence est très populaire et j'étais sûr que drupal avait fourni quelque chose pour cela.
Yusef
1

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

Freddy Amsterdam
la source
1

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

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

<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 de bienvenue 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.

Manuel Abascal
la source