检查用户是否以主题登录


16

在Drupal 7中,我们可以通过检查$GLOBAL['user']->uid或使用来简单地检查当前用户是否已登录主题user_is_logged_in()

在Drupal 8中,如何检查用户是否以页面模板登录?

一个解决方案是手动签入hook_preprocess_page(),但是由于它非常流行,我认为Drupal默认为Twig主题引擎提供一些功能。

Answers:


26

如果仅检查当前用户已登录,则可以使用$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.twigpage.html.twignode.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核心模块使用的模板文件之间,使用宏的模板文件为:

  • 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 %}
    
  • 菜单--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时,它可以工作。
No Sssweat 16/09/16

_template_preprocess_default_variables()每个模板Drupal输出都会调用,因此它添加的变量存在于所有模板文件中。据我所知,文档并没有记录所有默认变量。
kiamlaluno

2
@kiamlaluno每当您有空闲时间时,请尝试{% if logged_in %}menu.html.twig,您会发现它不起作用。没为我工作。
No Sssweat

6

您可以使用Twig Extender模块。从其项目页面引用:

添加一个简单的插件系统以添加新的树枝扩展名(过滤器和函数)。为“ twig.extensions”提供新的服务提供商,以添加新的插件。

函数:is_user_logged_in

检查用户是否登录。

{% if user_is_logged_in() %}
Hello user
{% else %}
Please login
{% endif %}

仅使用57和beta :(。也许更好的解决方法是$ vars ['is_login'] =!\ Drupal :: currentUser()-> isAnonymous();“在preprocess_page中?您有什么看法?
Yusef

2
由于Drupal核心已经具有该功能,因此不需要模块即可。看我的答案。
kiamlaluno

@kiamlaluno是的,我同意你的要求,这个要求非常受欢迎,我确信drupal已经为此提供了一些东西。
优素福

1

对于每个试图使用logged_inmenu.twig.html的人;您需要从menus.menu_links()宏外部调用它,因为logged_in变量超出了宏的范围。


1

您可以像这样检查用户是否已通过身份验证:

例如,我在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>

如果用户已登录,您将收到问候消息以及用户名,电子邮件和头像图片。如果用户未登录,则不会显示任何内容。

让我知道这是否有帮助和/或我是否可以编辑此帖子以更好地理解。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.