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


16

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

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

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

回答:


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.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 %}

The variable is surely available in all the template filesこれに関してあなたが間違っているのではないかと思います。テンプレートがコメントで言及していない場合は、理由があるはずですよね?私はmenu.html.twig(コメントで言及していない)を試してたが、うまくいかなかったからだ。Twig Extenderを使用している間は動作します。
いいえsssweat

_template_preprocess_default_variables()すべてのテンプレートDrupal出力に対して呼び出されるため、追加する変数はすべてのテンプレートファイルに存在します。私が見る限り、ドキュメントはすべてのデフォルト変数を文書化していません。
キアムルノ

2
暇なときはいつでも@kiamlalunoをmenu.html.twigで試してみ{% if logged_in %}てください。機能しないことがわかります。うまくいかなかった。
いいえSssweat

6

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

シンプルなプラグインシステムを追加して、新しいTwig拡張機能(フィルターと関数)を追加します。新しいプラグインを追加するための「twig.extensions」の新しいサービスプロバイダーを提供します。

関数:is_user_logged_in

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

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

わずか57の使用およびベータ:(多分あなたより良い解決策は、 `$は、[ 'is_login'] = \ Drupalの:: CurrentUserに()varsのさ- > isAnonymous()を;。!` preprocess_pageにあなたの意見は何ですか?
ユセフ

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.