Periksa apakah pengguna masuk dalam suatu tema

16

Di Drupal 7 kita cukup memeriksa apakah pengguna saat ini masuk dalam sebuah tema dengan memeriksa $GLOBAL['user']->uidatau menggunakan user_is_logged_in().

Bagaimana saya bisa memeriksa apakah pengguna masuk dalam templat halaman, di Drupal 8?

Sebuah solusi adalah dengan check-in secara manual hook_preprocess_page(), tetapi karena ini sangat populer, saya pikir Drupal menyediakan sesuatu secara default untuk mesin tema Twig.

Yusef
sumber

Jawaban:

26

Jika Anda hanya memeriksa pengguna saat ini login, Anda dapat menggunakan $variables['logged_in'], yang umumnya tersedia di semua file template.

Misalnya, file mark.html.twig menggunakan kode berikut, meskipun satu-satunya variabel yang didokumentasikan adalah 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 %}

Variabel secara eksplisit didokumentasikan dalam file templat lain, seperti html.html.twig , page.html.twig , dan node.html.twig .

Variabel tersedia di semua file template, karena ini diinisialisasi dalam _template_preprocess_default_variables()yang memanggil user_template_preprocess_default_variables_alter()(implementasi dari hook_template_preprocess_default_variables_alter()), yang berisi kode berikut.

  $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()disebut dengan template_preprocess(), yang merupakan fungsi yang dipanggil untuk tema kait diimplementasikan sebagai templat; ini menjamin variabel tersedia di semua file templat.

Perlu diingat bahwa makro tidak memiliki akses ke variabel templat saat ini , jadi mencoba mengakses logged_indalam kode makro tidak akan berpengaruh.
Di antara file templat yang digunakan dari modul inti Drupal, yang menggunakan makro adalah:

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

Misalnya, mengubah makro terakhir dengan kode berikut tidak akan memiliki hasil yang diharapkan.

{% 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
sumber
The variable is surely available in all the template filesSaya khawatir Anda salah tentang ini. Jika template tidak menyebutkannya di komentar, pasti ada alasannya, kan? Karena saya mencoba pada menu.html.twig (yang tidak menyebutkannya di komentar) dan tidak berhasil. Saat menggunakan Twig Extender berfungsi.
Tidak ada Sssweat
_template_preprocess_default_variables()dipanggil untuk setiap output template Drupal, sehingga variabel yang ditambahkannya ada di semua file template. Dokumentasi tidak mendokumentasikan semua variabel default, sejauh yang saya bisa lihat.
kiamlaluno
2
@kiamlaluno setiap kali Anda memiliki waktu luang, coba {% if logged_in %}pada menu.html.twig dan Anda akan melihatnya tidak berfungsi. Tidak bekerja untuk saya.
Tidak ada Sssweat
6

Anda bisa menggunakan modul Twig Extender . Kutipan dari halaman proyeknya:

Tambahkan sistem plugin sederhana untuk menambahkan ekstensi ranting baru (Filter dan Fungsi). Menyediakan penyedia layanan baru untuk "twig.extensions" untuk menambahkan plugin baru.

Fungsi: is_user_logged_in

Periksa apakah pengguna masuk.

{% if user_is_logged_in() %}
Hello user
{% else %}
Please login
{% endif %}
Tidak ada Sssweat
sumber
hanya 57 penggunaan dan beta :(. mungkin solusi yang lebih baik adalah `$ vars ['is_login'] =! \ Drupal :: currentUser () -> isAnonymous ();` di preprocess_page? apa pendapat Anda?
Yusef
2
Tidak perlu modul untuk fungsi itu, karena inti Drupal sudah memilikinya. Lihat jawaban saya.
kiamlaluno
@kiamlaluno Ya, saya setuju dengan Anda, persyaratan ini sangat populer dan saya yakin drupal telah menyediakan sesuatu untuk itu.
Yusef
1

Untuk semua orang yang mencoba menggunakan logged_indari menu.twig.html; Anda perlu menyebutnya dari luar menus.menu_links()makro karena logged_invariabel berada di luar cakupan dalam makro.

Freddy Amsterdam
sumber
1

Anda dapat memeriksa apakah pengguna dikonfirmasi seperti:

Misalnya, saya telah membuat fungsi berikut di 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;
  }
}

Setelah itu, Anda dapat membuat logika di dalam file Twig seperti:

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

Jika pengguna masuk, Anda akan mendapatkan pesan ucapan beserta nama pengguna, email & gambar avatar. Jika pengguna tidak masuk, itu tidak akan muncul apa-apa.

Beri tahu saya jika itu membantu dan / atau jika saya dapat mengedit posting ini untuk pemahaman yang lebih baik.

Manuel Abascal
sumber