web-dev-qa-db-ja.com

ユーザーがテーマにログインしているかどうかを確認する

Drupal 7では、_$GLOBAL['user']->uid_をチェックするか user_is_logged_in() を使用して、現在のユーザーがテーマにログインしているかどうかを簡単にチェックできます。

Drupal 8)で、ユーザーがページテンプレートにログインしているかどうかを確認するにはどうすればよいですか?

解決策はhook_preprocess_page()を手動でチェックインすることですが、これは非常に人気があるため、DrupalはデフォルトでTwigテーマエンジン。

17
Yusef

現在のユーザーがログインしていることを確認するだけの場合は、_$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.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コアモジュールから使用されるテンプレートファイル間で、マクロを使用するものは次のとおりです。

  • 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 %}
_
28
kiamlaluno

Twig Extender モジュールを使用できます。そのプロジェクトページからの引用:

シンプルなプラグインシステムを追加して、新しいtwig extensions(Filter and Functions))を追加します。「twig.extensions」に新しいサービスプロバイダーを提供して、新しいプラグインを追加します。

関数:is_user_logged_in

ユーザーがログインしているかどうかを確認します。

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

ユーザーが次のように認証されているかどうかを確認できます。

たとえば、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>

ユーザーがログインしている場合は、ユーザー名、メールアドレス、アバター画像とともに挨拶メッセージが表示されます。ユーザーがログインしていない場合、何も表示されません。

それが役立つかどうか、および/または理解を深めるためにこの投稿を編集できるかどうかをお知らせください。

1
Manuel Abascal

Menu.twig.htmlから_logged_in_を使用しようとするすべての人のために; _logged_in_変数はマクロ内ではスコープ外であるため、menus.menu_links()マクロの外側から呼び出す必要があります。

1