หากคุณเพียงแค่ตรวจสอบผู้ใช้ปัจจุบันเข้าสู่ระบบคุณสามารถใช้$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 มันใช้งานได้