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_in
dalam 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 %}
The variable is surely available in all the template files
Saya 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.