ตรวจสอบว่าผู้ใช้ล็อกอินในธีมหรือไม่


16

ใน Drupal 7 เราก็สามารถตรวจสอบว่าผู้ใช้ปัจจุบันถูกบันทึกไว้ในในรูปแบบโดยการตรวจสอบหรือการใช้$GLOBAL['user']->uiduser_is_logged_in()

ฉันจะตรวจสอบว่าผู้ใช้เข้าสู่ระบบในเทมเพลตหน้าใน Drupal 8 ได้อย่างไร

วิธีแก้ไขคือเช็คอินด้วยตนเองhook_preprocess_page()แต่เนื่องจากนี่เป็นที่นิยมมากฉันคิดว่า Drupal ให้บางสิ่งบางอย่างตามค่าเริ่มต้นสำหรับชุดรูปแบบ Twig

คำตอบ:


26

หากคุณเพียงแค่ตรวจสอบผู้ใช้ปัจจุบันเข้าสู่ระบบคุณสามารถใช้$variables['logged_in']ซึ่งโดยทั่วไปจะมีอยู่ในไฟล์แม่แบบทั้งหมด

ยกตัวอย่างเช่นmark.html.twigstatusไฟล์ใช้รหัสต่อไปแม้ว่าตัวแปรเอกสารเพียงอย่างเดียวคือ

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

ตัวแปรที่มีการบันทึกไว้อย่างชัดเจนในแฟ้มแม่แบบอื่น ๆ เช่นhtml.html.twig , page.html.twigและnode.html.twig

ตัวแปรนี้มีอยู่ในไฟล์เทมเพลตทั้งหมดเนื่องจากมีการเริ่มต้นในการ_template_preprocess_default_variables()เรียกใช้user_template_preprocess_default_variables_alter()(การใช้งานhook_template_preprocess_default_variables_alter()) ซึ่งมีรหัสต่อไปนี้

  $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()ถูกเรียกใช้โดยtemplate_preprocess()ซึ่งเป็นฟังก์ชันที่เรียกใช้สำหรับธีม hooks ที่ใช้เป็นเทมเพลต สิ่งนี้รับประกันว่าตัวแปรนั้นมีอยู่ในไฟล์เทมเพลตทั้งหมด

โปรดทราบว่าแมโครไม่มีสิทธิ์เข้าถึงตัวแปรเท็มเพลตปัจจุบันดังนั้นการพยายามเข้าถึงlogged_inโค้ดของมาโครจะไม่มีผลใด ๆ
ระหว่างไฟล์เทมเพลตที่ใช้จากโมดูลหลักของ Drupal ไฟล์ที่ใช้มาโครคือ:

  • 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 %}
  • หนังสือ 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 %}
  • เมนู - 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 %}

ตัวอย่างเช่นการเปลี่ยนแมโครสุดท้ายด้วยรหัสต่อไปนี้จะไม่มีผลที่คาดหวัง

{% 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 filesฉันเกรงว่าคุณผิดในเรื่องนี้ หากเทมเพลตไม่ได้กล่าวถึงในความคิดเห็นจะต้องมีเหตุผลใช่มั้ย เพราะฉันลองที่menu.html.twig (ซึ่งไม่ได้พูดถึงในความคิดเห็น) และไม่ทำงาน ในขณะที่ใช้ Twig Extender มันใช้งานได้
ไม่มี Sssweat

_template_preprocess_default_variables()ถูกเรียกใช้สำหรับทุกเทมเพลตเอาต์พุต Drupal ดังนั้นตัวแปรที่เพิ่มเข้ามาจึงมีอยู่ในไฟล์เทมเพลตทั้งหมด เอกสารไม่ใช่เอกสารตัวแปรเริ่มต้นทั้งหมดเท่าที่ฉันเห็น
kiamlaluno

2
@kiamlaluno เมื่อใดก็ตามที่คุณมีเวลาว่างลอง{% if logged_in %}ที่ menu.html.twig และคุณจะเห็นว่ามันใช้งานไม่ได้ ไม่ได้ผลสำหรับฉัน
ไม่มี Sssweat

6

คุณสามารถใช้โมดูลTwig Extender อ้างอิงจากหน้าโครงการ:

เพิ่มระบบปลั๊กอินอย่างง่ายเพื่อเพิ่มส่วนขยายกิ่งใหม่ (ตัวกรองและฟังก์ชั่น) จัดเตรียมผู้ให้บริการใหม่สำหรับ "twig.extensions" เพื่อเพิ่มปลั๊กอินใหม่

ฟังก์ชั่น: is_user_logged_in

ตรวจสอบว่าผู้ใช้เข้าสู่ระบบ

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

เพียง 57 การใช้งานและเบต้า :( บางทีเจ้าทางออกที่ดีกว่าคือ `$ vars ['is_login'] =! \ Drupal :: currentUser () -> isAnonymous (); ใน preprocess_page คุณมีความคิดเห็นอย่างไร
Yusef

2
ไม่จำเป็นต้องมีโมดูลสำหรับฟังก์ชั่นนั้นเนื่องจาก Drupal core มีอยู่แล้ว ดูคำตอบของฉัน
kiamlaluno

@kiamlaluno ใช่ฉันเห็นด้วยกับคุณแล้วความต้องการนี้เป็นที่นิยมมากและฉันก็มั่นใจว่า drupal ได้จัดหาอะไรบางอย่างให้กับมัน
Yusef

1

สำหรับทุกคนที่พยายามใช้logged_inจาก menu.twig.html; คุณต้องเรียกมันจากนอกmenus.menu_links()มาโครเนื่องจากlogged_inตัวแปรนั้นอยู่นอกขอบเขตภายในแมโคร


1

คุณสามารถตรวจสอบว่าผู้ใช้รับรองความถูกต้องเช่น:

ตัวอย่างเช่นฉันได้สร้างฟังก์ชั่นต่อไปนี้ใน 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;
  }
}

หลังจากนั้นคุณสามารถสร้างตรรกะภายในไฟล์ Twig ดังนี้:

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

หากผู้ใช้ลงชื่อเข้าใช้คุณจะได้รับข้อความทักทายพร้อมกับชื่อผู้ใช้อีเมลและรูปภาพประจำตัว หากผู้ใช้ไม่ได้เข้าสู่ระบบก็จะไม่แสดงอะไรเลย

แจ้งให้เราทราบหากสิ่งนั้นช่วยได้และ / หรือถ้าฉันสามารถแก้ไขโพสต์นี้เพื่อความเข้าใจที่ดีขึ้น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.