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.twig và node.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_in
và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 files
Tô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.