Verifique se o usuário está logado em um tema

16

No Drupal 7, podemos simplesmente verificar se o usuário atual está logado em um tema, marcando $GLOBAL['user']->uidou usando user_is_logged_in().

Como posso verificar se um usuário está logado em um modelo de página, no Drupal 8?

Uma solução é fazer check-in manualmente hook_preprocess_page(), mas como isso é muito popular, acho que o Drupal fornece algo por padrão para o mecanismo de tema Twig.

Yusef
fonte

Respostas:

26

Se você apenas verificar se o usuário atual está logado, pode usar $variables['logged_in'], que geralmente está disponível em todos os arquivos de modelo.

Por exemplo, o arquivo mark.html.twig usa o código a seguir, embora a única variável documentada seja 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 %}

A variável está explicitamente documentada em outros arquivos de modelo, como html.html.twig , page.html.twig e node.html.twig .

A variável está disponível em todos os arquivos de modelo, pois é inicializada _template_preprocess_default_variables()nessa chamada user_template_preprocess_default_variables_alter()(uma implementação de hook_template_preprocess_default_variables_alter()), que contém o seguinte código.

  $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()é chamado por template_preprocess(), que é a função chamada de ganchos de tema implementados como modelos; isso garante que a variável esteja disponível em todos os arquivos de modelo.

Lembre-se de que as macros não têm acesso às variáveis ​​de modelo atuais , portanto, tentar acessar logged_inno código de uma macro não teria nenhum efeito.
Entre os arquivos de modelo usados ​​nos módulos principais do Drupal, os que usam uma macro são:

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

Por exemplo, alterar a última macro com o código a seguir não teria o resultado esperado.

{% 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 %}
kiamlaluno
fonte
The variable is surely available in all the template filesReceio que você esteja errado em relação a isso. Se o modelo não mencionar isso nos comentários, deve haver uma razão, certo? Porque eu tentei no menu.html.twig (que não menciona nos comentários) e não funcionou. Enquanto estiver usando o Twig Extender, ele funciona.
No Sssweat
_template_preprocess_default_variables()é chamado para todas as saídas do Drupal de modelo, portanto as variáveis ​​adicionadas estão presentes em todos os arquivos de modelo. A documentação não documenta todas as variáveis ​​padrão, tanto quanto eu posso ver.
kiamlaluno
2
@kiamlaluno sempre que tiver tempo livre, experimente o {% if logged_in %}menu.html.twig e verá que ele não funciona. Não funcionou para mim.
No Sssweat 16/09/16
6

Você pode com o módulo Twig Extender . Cite a partir da página do projeto:

Adicione um sistema de plug-ins simples para adicionar novas extensões de galho (filtro e funções). Fornece um novo provedor de serviços para "twig.extensions" para adicionar novos plugins.

Função: is_user_logged_in

Verifique se o usuário está logado.

{% if user_is_logged_in() %}
Hello user
{% else %}
Please login
{% endif %}
Sem suor
fonte
somente 57 use e beta :(. talvez a melhor solução seja `$ vars ['is_login'] =! \ Drupal :: currentUser () -> isAnonymous ();` in preprocess_page? qual é a sua opinião?
Yusef
2
Não há necessidade de um módulo para essa funcionalidade, pois o núcleo do Drupal já o possui. Veja minha resposta.
kiamlaluno
@kiamlaluno Sim, eu concordo com você, esse requisito é muito popular e eu tinha certeza que o drupal havia fornecido algo para ele.
Yusef
1

Para todos que tentam usar logged_inem menu.twig.html; você precisa chamá-lo de fora da menus.menu_links()macro, pois a logged_invariável está fora do escopo dentro da macro.

Freddy Amsterdam
fonte
1

Você pode verificar se o usuário está autenticado da seguinte forma:

Por exemplo, eu criei a seguinte função em 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;
  }
}

Depois disso, você pode criar a lógica dentro do arquivo Twig da seguinte forma:

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

Se o usuário estiver logado, você receberá a mensagem de saudação juntamente com o nome de usuário, email e foto do avatar. Se o usuário não estiver logado, ele não será exibido.

Deixe-me saber se isso ajuda e / ou se posso editar este post para entender melhor.

Manuel Abascal
fonte