在Drupal 7中,我们可以通过检查$GLOBAL['user']->uid
或使用来简单地检查当前用户是否已登录主题user_is_logged_in()
。
在Drupal 8中,如何检查用户是否以页面模板登录?
一个解决方案是手动签入hook_preprocess_page()
,但是由于它非常流行,我认为Drupal默认为Twig主题引擎提供一些功能。
在Drupal 7中,我们可以通过检查$GLOBAL['user']->uid
或使用来简单地检查当前用户是否已登录主题user_is_logged_in()
。
在Drupal 8中,如何检查用户是否以页面模板登录?
一个解决方案是手动签入hook_preprocess_page()
,但是由于它非常流行,我认为Drupal默认为Twig主题引擎提供一些功能。
Answers:
如果仅检查当前用户已登录,则可以使用$variables['logged_in']
,通常在所有模板文件中都可以使用。
例如,mark.html.twig文件使用以下代码,尽管唯一记录的变量是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 %}
该变量已明确记录在其他模板文件中,例如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()
,这是作为模板实现的主题挂钩的函数;这样可以确保该变量在所有模板文件中均可用。
请记住,宏无权访问当前模板变量,因此尝试访问logged_in
宏代码不会产生任何效果。
在Drupal核心模块使用的模板文件之间,使用宏的模板文件为:
{% 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 %}
{% 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 %}
{% 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 %}
_template_preprocess_default_variables()
每个模板Drupal输出都会调用,因此它添加的变量存在于所有模板文件中。据我所知,文档并没有记录所有默认变量。
{% if logged_in %}
menu.html.twig,您会发现它不起作用。没为我工作。
您可以使用Twig Extender模块。从其项目页面引用:
添加一个简单的插件系统以添加新的树枝扩展名(过滤器和函数)。为“ twig.extensions”提供新的服务提供商,以添加新的插件。
函数:is_user_logged_in
检查用户是否登录。
{% if user_is_logged_in() %} Hello user {% else %} Please login {% endif %}
您可以像这样检查用户是否已通过身份验证:
例如,我在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>
如果用户已登录,您将收到问候消息以及用户名,电子邮件和头像图片。如果用户未登录,则不会显示任何内容。
让我知道这是否有帮助和/或我是否可以编辑此帖子以更好地理解。
The variable is surely available in all the template files
恐怕您对此有误。如果模板未在评论中提及它,那么一定有原因吧?因为我尝试过menu.html.twig(在注释中未提及),但是没有用。在使用Twig Extender时,它可以工作。