Kullanıcının bir temayla oturum açıp açmadığını kontrol edin


16

Drupal 7'de, mevcut kullanıcının bir temaya giriş yapıp yapmadığını kontrol ederek $GLOBAL['user']->uidveya kullanarak kontrol edebiliriz user_is_logged_in().

Bir kullanıcının Drupal 8'de bir sayfa şablonunda oturum açıp açmadığını nasıl kontrol edebilirim?

Bir çözüm el ile kontrol etmektir hook_preprocess_page(), ancak bu çok popüler olduğu için, Drupal'ın Twig tema motoru için varsayılan olarak bir şey sağladığını düşünüyorum.

Yanıtlar:


26

Sadece geçerli kullanıcının oturum açmış olduğunu kontrol ederseniz $variables['logged_in'], genellikle tüm şablon dosyalarında bulunan bu düğmeyi kullanabilirsiniz.

Örneğin, belgelenen tek değişken olmasına rağmen mark.html.twig dosyası aşağıdaki kodu kullanır 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 %}

Değişken, html.html.twig , page.html.twig ve node.html.twig gibi diğer şablon dosyalarında açıkça belgelenmiştir .

Değişken tüm şablon dosyalarında kullanılabilir, çünkü aşağıdaki kodu içeren _template_preprocess_default_variables()bu çağrıları user_template_preprocess_default_variables_alter()(uygulaması hook_template_preprocess_default_variables_alter()) başlatır .

  $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()tarafından çağrılan template_preprocess()şablon olarak uygulanan tema kancalar çağrısında işlevi olan; bu, değişkenin tüm şablon dosyalarında kullanılabilir olmasını garanti eder.

Makroların geçerli şablon değişkenlerine erişimi olmadığını unutmayın , bu nedenle logged_inbir makronun kodunda erişmeye çalışmanın herhangi bir etkisi olmayacaktır.
Drupal çekirdek modüllerinden kullanılan şablon dosyaları arasında, makro kullanan dosyalar şunlardır:

  • 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 %}
  • kitap-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 %}
  • menüsü - 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 %}

Örneğin, son makroyu aşağıdaki kodla değiştirmek beklenen sonucu vermeyecektir.

{% 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 filesKorkarım bu konuda yanlışsın. Şablon yorumlarda belirtmiyorsa, bir nedeni olmalı, değil mi? Çünkü menu.html.twig üzerinde denedim (yorumlarda bahsetmiyor) ve işe yaramadı. Twig Extender kullanırken çalışır.
Hayır Sssweat

_template_preprocess_default_variables()her şablon Drupal çıktısı için çağrılır, bu nedenle eklediği değişkenler tüm şablon dosyalarında bulunur. Belgeler, görebildiğim kadarıyla tüm varsayılan değişkenleri belgelemiyor.
kiamlaluno

2
@kiamlaluno, boş zamanınız olduğunda menu.html.twig {% if logged_in %}üzerinde deneyin ve işe yaramadığını göreceksiniz. Benim için çalışmadı.
16:06

6

Twig Extender modülü ile yapabilirsiniz . Proje sayfasından alıntı:

Yeni dal uzantıları (Filtre ve İşlevler) eklemek için basit bir eklenti sistemi ekleyin. Yeni eklentiler eklemek için "twig.extensions" için yeni bir servis sağlayıcı sağlar.

İşlev: is_user_oked_in

Kullanıcının oturum açıp açmadığını kontrol edin.

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

sadece 57 kullanım ve beta :(. belki daha iyi çözüm `$ vars ['is_login'] =! \ Drupal :: currentUser () -> isAnonymous ();` önişlem_sayfada? fikriniz nedir?
Yusef

2
Bu işlev için bir modüle gerek yoktur, çünkü Drupal core zaten sahiptir. Cevabımı gör.
kiamlaluno

@kiamlaluno Evet, sana katılıyorum, bu gereksinim çok popüler ve drupal'ın bunun için bir şey sağladığından emindim.
Yusef

1

logged_inMenu.twig.html adresinden kullanmaya çalışan herkes için ; değişken menus.menu_links()makro logged_iniçinde kapsam dışında olduğu için makro dışından çağırmanız gerekir .


1

Kullanıcının kimliğinin doğrulanıp doğrulanmadığını kontrol edebilirsiniz:

Örneğin, themename.theme içinde aşağıdaki işlevi oluşturdum.

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

Bundan sonra, Twig dosyasında mantığı şu şekilde oluşturabilirsiniz:

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

Kullanıcı oturum açtıysa, tebrik mesajını kullanıcı adı, e-posta ve avatar resmi ile birlikte alacaksınız. Kullanıcı oturum açmadıysa, hiçbir şey göstermez.

Bunun yardımcı olup olmadığını ve / veya bu gönderiyi daha iyi anlamak için düzenleyebilir miyim?

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.