사용자가 테마에 로그인했는지 확인


16

Drupal 7에서는를 확인 $GLOBAL['user']->uid하거나 사용하여 현재 사용자가 테마에 로그인되어 있는지 간단히 확인할 수 있습니다 user_is_logged_in().

Drupal 8에서 사용자가 페이지 템플릿에 로그인했는지 어떻게 확인할 수 있습니까?

해결책은 수동으로 확인하는 것입니다 hook_preprocess_page(), 그러나 이것은 매우 인기가 있기 때문에, 나는 드루팔이 나뭇 가지 테마 엔진 기본적으로 뭔가를 제공합니다 생각합니다.

답변:


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.twig , page.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 %}
  • 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 %}

예를 들어 다음 코드를 사용하여 마지막 매크로를 변경하면 예상 한 결과가 없습니다.

{% 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

_template_preprocess_default_variables()모든 템플릿 Drupal 출력에 대해 호출되므로 추가하는 변수가 모든 템플릿 파일에 존재합니다. 문서는 내가 볼 수있는 한 모든 기본 변수를 문서화하지는 않습니다.
kiamlaluno

2
@kiamlaluno 자유 시간이있을 때마다 menu.html.twig에서 시도 {% if logged_in %}하면 작동하지 않는 것을 볼 수 있습니다. 나를 위해 작동하지 않았다.
No Sssweat

6

Twig Extender 모듈을 사용할 수 있습니다 . 프로젝트 페이지에서 인용 :

간단한 플러그인 시스템을 추가하여 새 나뭇 가지 확장 (필터 및 기능)을 추가하십시오. "twig.extensions"에 새로운 플러그인을 추가 할 수있는 새로운 서비스 제공 업체를 제공합니다.

기능 : is_user_logged_in

사용자가 로그인했는지 확인하십시오.

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

단지 57 개의 사용과 베타 :(. 아마도 더 나은 해결책은`$ 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>

사용자가 로그인하면 사용자 이름, 이메일 및 아바타 사진과 함께 인사말 메시지가 표시됩니다. 사용자가 로그인하지 않으면 아무 것도 표시되지 않습니다.

도움이되는지, 더 잘 이해하기 위해이 게시물을 편집 할 수 있는지 알려주세요.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.