Si solo desea verificar que el usuario actual ha iniciado sesión, puede usarlo $variables['logged_in']
, que generalmente está disponible en todos los archivos de plantilla.
Por ejemplo, el archivo mark.html.twig usa el siguiente código, aunque la única variable documentada es 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 %}
La variable está documentada explícitamente en otros archivos de plantilla, como html.html.twig , page.html.twig y node.html.twig .
La variable está disponible en todos los archivos de plantilla, ya que se inicializa en _template_preprocess_default_variables()
esas invocaciones user_template_preprocess_default_variables_alter()
(una implementación de hook_template_preprocess_default_variables_alter()
), que contiene el siguiente código.
$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()
se llama por template_preprocess()
, que es la función llamada por los ganchos de tema implementados como plantillas; Esto garantiza que la variable esté disponible en todos los archivos de plantilla.
Tenga en cuenta que las macros no tienen acceso a las variables de plantilla actuales , por lo que intentar acceder logged_in
en el código de una macro no tendría ningún efecto.
Entre los archivos de plantilla utilizados de los módulos principales de Drupal, los que usan una macro son:
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 %}
Por ejemplo, cambiar la última macro con el siguiente código no tendría el resultado esperado.
{% 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
Me temo que te equivocas con respecto a esto. Si la plantilla no lo menciona en los comentarios, debe haber una razón, ¿verdad? Porque probé en menu.html.twig (que no lo menciona en los comentarios) y no funcionó. Mientras usa Twig Extender funciona._template_preprocess_default_variables()
se llama para todas las salidas de plantilla de Drupal, por lo que las variables que agrega están presentes en todos los archivos de plantilla. La documentación no documenta todas las variables predeterminadas, por lo que puedo ver.{% if logged_in %}
en menu.html.twig y verá que no funciona. No funciono para mi.Puedes hacerlo con el módulo Twig Extender . Cita de su página de proyecto:
fuente
Para todos los que intenten usar
logged_in
desde menu.twig.html; debe llamarlo desde fuera de lamenus.menu_links()
macro ya que lalogged_in
variable está fuera del alcance dentro de la macro.fuente
Puede verificar si el usuario está autenticado así:
Por ejemplo, he creado la siguiente función en themename.theme.
Después de eso, puede crear la lógica dentro del archivo Twig de la siguiente manera:
Si el usuario ha iniciado sesión, recibirá el mensaje de saludo junto con el nombre de usuario, el correo electrónico y la imagen de avatar. Si el usuario no ha iniciado sesión, no mostrará nada.
Avíseme si eso ayuda y / o si puedo editar esta publicación para una mejor comprensión.
fuente