Überprüfen Sie, ob der Benutzer in einem Thema angemeldet ist

16

In Drupal 7 können wir einfach überprüfen, ob der aktuelle Benutzer in einem Thema angemeldet ist, indem wir dies überprüfen $GLOBAL['user']->uidoder verwenden user_is_logged_in().

Wie kann ich in Drupal 8 überprüfen, ob ein Benutzer in einer Seitenvorlage angemeldet ist?

Eine Lösung ist das manuelle Einchecken hook_preprocess_page(), aber da dies sehr beliebt ist, bietet Drupal meiner Meinung nach standardmäßig etwas für die Twig-Theme-Engine.

Yusef
quelle

Antworten:

26

Wenn Sie nur überprüfen möchten, ob der aktuelle Benutzer angemeldet ist, können Sie verwenden $variables['logged_in'], was generell in allen Vorlagendateien verfügbar ist.

In der Datei mark.html.twig wird beispielsweise der folgende Code verwendet, obwohl dies die einzige dokumentierte Variable ist 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 %}

Die Variable wird in anderen Template - Dateien, wie explizit dokumentiert html.html.twig , page.html.twig und node.html.twig .

Die Variable ist in allen Vorlagendateien verfügbar, da sie in _template_preprocess_default_variables()diesem Aufruf user_template_preprocess_default_variables_alter()(einer Implementierung von hook_template_preprocess_default_variables_alter()) initialisiert wird , der den folgenden Code enthält.

  $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()wird aufgerufen von template_preprocess(). Dies ist die Funktion, die für als Vorlagen implementierte Design-Hooks aufgerufen wird. Dies garantiert, dass die Variable in allen Vorlagendateien verfügbar ist.

Beachten Sie, dass Makros keinen Zugriff auf die aktuellen Vorlagenvariablen haben. Daher hat der Versuch, auf logged_inden Code eines Makros zuzugreifen , keine Auswirkungen.
Unter den Vorlagendateien, die von Drupal-Kernmodulen verwendet werden, sind diejenigen, die ein Makro verwenden:

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

Das Ändern des letzten Makros mit dem folgenden Code hätte beispielsweise nicht das erwartete Ergebnis.

{% 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
quelle
The variable is surely available in all the template filesIch fürchte, Sie irren sich diesbezüglich. Wenn das Template es in den Kommentaren nicht erwähnt, muss es einen Grund geben, oder? Weil ich menu.html.twig anprobiert habe (was es in den Kommentaren nicht erwähnt) und nicht funktioniert habe. Während der Verwendung von Twig Extender funktioniert es.
Kein Sssweat
_template_preprocess_default_variables()wird für jede Vorlage Drupal-Ausgaben aufgerufen, so dass die Variablen, die es hinzufügt, in allen Vorlagendateien vorhanden sind. Die Dokumentation dokumentiert nicht alle Standardvariablen, soweit ich sehen kann.
kiamlaluno
2
@kiamlaluno Wenn du Zeit hast, probiere {% if logged_in %}menu.html.twig an und du wirst sehen, dass es nicht funktioniert. Hat bei mir nicht funktioniert.
Kein Sssweat
6

Sie können mit dem Twig Extender- Modul. Zitat von seiner Projektseite:

Fügen Sie ein einfaches Pluginsystem hinzu, um neue Zweigerweiterungen hinzuzufügen (Filter und Funktionen). Bietet einen neuen Dienstanbieter für "twig.extensions", um neue Plugins hinzuzufügen.

Funktion: is_user_logged_in

Überprüfen Sie, ob der Benutzer angemeldet ist.

{% if user_is_logged_in() %}
Hello user
{% else %}
Please login
{% endif %}
Kein Sssweat
quelle
nur 57 Verwendung und Beta :(. Vielleicht ist die bessere Lösung "$ vars ['is_login'] =! \ Drupal :: currentUser () -> isAnonymous ();" in preprocess_page? Was ist Ihre Meinung?
Yusef
2
Für diese Funktionalität wird kein Modul benötigt, da Drupal Core sie bereits besitzt. Siehe meine Antwort.
kiamlaluno
@kiamlaluno Ja, ich stimme Ihnen zu, diese Anforderung ist sehr beliebt und ich war mir sicher, dass Drupal etwas dafür bereitgestellt hat.
Yusef
1

Für alle, die es mit logged_inmenu.twig.html versuchen; Sie müssen es von außerhalb des menus.menu_links()Makros aufrufen, da die logged_inVariable innerhalb des Makros außerhalb des Gültigkeitsbereichs liegt.

Freddy Amsterdam
quelle
1

Sie können überprüfen, ob der Benutzer wie folgt authentifiziert ist:

Zum Beispiel habe ich die folgende Funktion in themename.theme erstellt.

# 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;
  }
}

Danach können Sie die Logik in der Twig-Datei wie folgt erstellen:

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

Wenn der Benutzer angemeldet ist, erhalten Sie die Begrüßungsnachricht zusammen mit dem Benutzernamen, der E-Mail und dem Avatar-Bild. Wenn der Benutzer nicht angemeldet ist, wird nichts angezeigt.

Lassen Sie mich wissen, ob das hilft und / oder ob ich diesen Beitrag zum besseren Verständnis bearbeiten kann.

Manuel Abascal
quelle