Sprawdź, czy użytkownik jest zalogowany w motywie

16

W Drupal 7 możemy po prostu sprawdzić, czy bieżący użytkownik jest zalogowany w motywie, sprawdzając $GLOBAL['user']->uidlub używając user_is_logged_in().

Jak mogę sprawdzić, czy użytkownik jest zalogowany w szablonie strony w Drupal 8?

Rozwiązaniem jest ręczne zameldowanie hook_preprocess_page(), ale ponieważ jest to bardzo popularne, myślę, że Drupal domyślnie zapewnia coś dla silnika motywu Twig.

Yusef
źródło

Odpowiedzi:

26

Jeśli chcesz tylko sprawdzić, czy bieżący użytkownik jest zalogowany, możesz użyć $variables['logged_in'], który jest ogólnie dostępny we wszystkich plikach szablonów.

Na przykład plik mark.html.twig używa następującego kodu, chociaż jedyną udokumentowaną zmienną jest 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 %}

Zmienna jest jawnie udokumentowana w innych plikach szablonów, takich jak html.html.twig , page.html.twig i node.html.twig .

Zmienna jest dostępna we wszystkich plikach szablonów, ponieważ jest inicjowana w _template_preprocess_default_variables()tym user_template_preprocess_default_variables_alter()wywołaniu (implementacji hook_template_preprocess_default_variables_alter()), która zawiera następujący kod.

  $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()jest wywoływany przez template_preprocess(), która jest funkcją wywoływaną dla zaczepów motywu zaimplementowanych jako szablony; gwarantuje to, że zmienna jest dostępna we wszystkich plikach szablonów.

Należy pamiętać, że makra nie mają dostępu do bieżących zmiennych szablonu , więc próba dostępu logged_indo kodu makra nie przyniesie żadnego efektu.
Pomiędzy plikami szablonów używanymi z podstawowych modułów Drupala, te używające makra to:

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

Na przykład zmiana ostatniego makra za pomocą następującego kodu nie przyniosłaby oczekiwanego rezultatu.

{% 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
źródło
The variable is surely available in all the template filesObawiam się, że się mylisz w tej sprawie. Jeśli szablon nie wspomina o tym w komentarzach, musi być jakiś powód, prawda? Ponieważ próbowałem na menu.html.twig (który nie wspomina o tym w komentarzach) i nie działało. Podczas korzystania z Twig Extender działa.
Bez Sssweat
_template_preprocess_default_variables()jest wywoływany dla każdego szablonu Drupala, więc dodane przez niego zmienne są obecne we wszystkich plikach szablonu. Dokumentacja nie dokumentuje wszystkich domyślnych zmiennych, o ile widzę.
kiamlaluno
2
@kiamlaluno, ilekroć masz czas wolny, wypróbuj {% if logged_in %}menu.html.twig, a zobaczysz, że to nie działa. Nie działało dla mnie.
Bez Sssweat,
6

Możesz to zrobić dzięki modułowi Twig Extender . Cytat ze strony projektu:

Dodaj prosty system wtyczek, aby dodać nowe rozszerzenia gałązek (Filtr i funkcje). Udostępnia nowego dostawcę usług dla „twig.extensions” w celu dodawania nowych wtyczek.

Funkcja: is_user_logged_in

Sprawdź, czy użytkownik jest zalogowany.

{% if user_is_logged_in() %}
Hello user
{% else %}
Please login
{% endif %}
Bez sssweat
źródło
tylko 57 use i beta :(. może twoim lepszym rozwiązaniem jest `$ vars ['is_login'] =! \ Drupal :: currentUser () -> isAnonymous ();` w preprocess_page? jakie jest twoje zdanie?
Yusef
2
Do tej funkcjonalności nie jest potrzebny moduł, ponieważ rdzeń Drupala już go ma. Zobacz moją odpowiedź.
kiamlaluno
@kiamlaluno Tak, zgadzam się z tobą, ten wymóg jest bardzo popularny i byłem pewien, że Drupal coś dla niego dostarczył.
Yusef
1

Dla wszystkich, którzy próbują korzystać logged_inz menu.twig.html; musisz wywołać go spoza menus.menu_links()makra, ponieważ logged_inzmienna jest poza zakresem w makrze.

Freddy Amsterdam
źródło
1

Możesz sprawdzić, czy użytkownik jest uwierzytelniony w następujący sposób:

Na przykład utworzyłem następującą funkcję w 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;
  }
}

Następnie możesz utworzyć logikę w pliku Twig w następujący sposób:

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

Jeśli użytkownik jest zalogowany, otrzymasz wiadomość powitalną wraz z nazwą użytkownika, adresem e-mail i zdjęciem awatara. Jeśli użytkownik nie jest zalogowany, nic się nie pokaże.

Daj mi znać, czy to pomoże i / lub czy mogę edytować ten post dla lepszego zrozumienia.

Manuel Abascal
źródło