Kiểm tra xem người dùng đã đăng nhập vào một chủ đề chưa


16

Trong Drupal 7, chúng ta chỉ cần kiểm tra xem người dùng hiện tại có đăng nhập vào một chủ đề $GLOBAL['user']->uidhay không bằng cách kiểm tra hoặc sử dụng user_is_logged_in().

Làm cách nào để kiểm tra xem người dùng đã đăng nhập vào mẫu trang, trong Drupal 8 chưa?

Một giải pháp là kiểm tra thủ công hook_preprocess_page(), nhưng vì điều này rất phổ biến, tôi nghĩ Drupal cung cấp một cái gì đó theo mặc định cho công cụ chủ đề Twig.

Câu trả lời:


26

Nếu bạn chỉ để kiểm tra người dùng hiện tại đã đăng nhập, bạn có thể sử dụng $variables['logged_in'], thường có sẵn trong tất cả các tệp mẫu.

Ví dụ: tệp mark.html.twig sử dụng mã sau đây, mặc dù biến tài liệu duy nhất là 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 %}

Biến được ghi lại rõ ràng trong các tệp mẫu khác, chẳng hạn như html.html.twig , page.html.twignode.html.twig .

Biến có sẵn trong tất cả các tệp mẫu, vì nó được khởi tạo trong lệnh _template_preprocess_default_variables()gọi đó user_template_preprocess_default_variables_alter()(một cách thực hiện hook_template_preprocess_default_variables_alter()), chứa mã sau đây.

  $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()được gọi bởi template_preprocess(), đó là chức năng được gọi cho móc chủ đề được triển khai dưới dạng mẫu; điều này đảm bảo biến có sẵn trong tất cả các tệp mẫu.

Hãy nhớ rằng các macro không có quyền truy cập vào các biến mẫu hiện tại , do đó, cố gắng truy cập logged_invào mã của macro sẽ không có bất kỳ ảnh hưởng nào.
Giữa các tệp mẫu được sử dụng từ các mô-đun lõi Drupal, các tệp sử dụng macro là:

  • 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 %}
  • cuốn sách cây.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 - thanh công cụ.html.

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

Ví dụ: thay đổi macro cuối cùng bằng mã sau sẽ không có kết quả như mong đợi.

{% 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 filesTôi sợ bạn sai về điều này. Nếu mẫu không đề cập đến nó trong các ý kiến, phải có một lý do, phải không? Bởi vì tôi đã thử trên menu.html.twig (không đề cập đến nó trong các bình luận) và không hoạt động. Trong khi sử dụng Twig Extender, nó hoạt động.
Không có Sssweat

_template_preprocess_default_variables()được gọi cho mọi đầu ra Drupal mẫu, vì vậy các biến mà nó thêm vào có trong tất cả các tệp mẫu. Tài liệu không ghi lại tất cả các biến mặc định, theo như tôi có thể thấy.
kiamlaluno

2
@kiamlaluno bất cứ khi nào bạn có thời gian rảnh, hãy thử {% if logged_in %}trên menu.html.twig và bạn sẽ thấy nó không hoạt động. Không làm việc cho tôi.
Không có Sssweat

6

Bạn có thể với mô-đun Twig Extender . Trích dẫn từ trang dự án của nó:

Thêm một hệ thống plugin đơn giản để thêm các tiện ích mở rộng twig mới (Bộ lọc và Chức năng). Cung cấp một nhà cung cấp dịch vụ mới cho "twig.extensions" để thêm các plugin mới.

Hàm: is_user_logged_in

Kiểm tra nếu người dùng đã đăng nhập.

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

chỉ có 57 sử dụng và beta :(. có lẽ giải pháp tốt hơn của bạn là `$ vars ['is_login'] =! \ Drupal :: currentUser () -> isAnonymous ();` trong pre process_page? Ý kiến ​​của bạn là gì?
Yusef

2
Không cần mô-đun cho chức năng đó, vì lõi Drupal đã có nó. Xem câu trả lời của tôi.
kiamlaluno

@kiamlaluno Vâng, tôi đồng ý với bạn, yêu cầu này rất phổ biến và tôi chắc chắn rằng drupal đã cung cấp một cái gì đó cho nó.
Yusef

1

Đối với mọi người đang cố gắng sử dụng logged_intừ menu.twig.html; bạn cần gọi nó từ bên ngoài menus.menu_links()macro vì logged_inbiến nằm ngoài phạm vi trong macro.


1

Bạn có thể kiểm tra xem người dùng có được xác thực như vậy không:

Ví dụ, tôi đã tạo hàm sau trong 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;
  }
}

Sau đó, bạn có thể tạo logic trong tệp Twig như sau:

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

Nếu người dùng đăng nhập, bạn sẽ nhận được tin nhắn chúc mừng cùng với tên người dùng, email và hình ảnh đại diện. Nếu người dùng không đăng nhập, nó sẽ không hiển thị bất cứ điều gì.

Hãy cho tôi biết nếu điều đó giúp và / hoặc nếu tôi có thể chỉnh sửa bài đăng này để hiểu rõ hơn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.