Compruebe si el usuario ha iniciado sesión en un tema

16

En Drupal 7, simplemente podemos verificar si el usuario actual ha iniciado sesión en un tema verificando $GLOBAL['user']->uido usando user_is_logged_in().

¿Cómo puedo verificar si un usuario ha iniciado sesión en una plantilla de página, en Drupal 8?

Una solución es registrarse manualmente hook_preprocess_page(), pero como esto es muy popular, creo que Drupal proporciona algo por defecto para el motor de temas Twig.

Yusef
fuente

Respuestas:

26

Si solo desea verificar que el usuario actual ha iniciado sesión, puede usarlo $variables['logged_in'], que generalmente está disponible en todos los archivos de plantilla.

Por ejemplo, el archivo mark.html.twig usa el siguiente código, aunque la única variable documentada es 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 %}

La variable está documentada explícitamente en otros archivos de plantilla, como html.html.twig , page.html.twig y node.html.twig .

La variable está disponible en todos los archivos de plantilla, ya que se inicializa en _template_preprocess_default_variables()esas invocaciones user_template_preprocess_default_variables_alter()(una implementación de hook_template_preprocess_default_variables_alter()), que contiene el siguiente 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()se llama por template_preprocess(), que es la función llamada por los ganchos de tema implementados como plantillas; Esto garantiza que la variable esté disponible en todos los archivos de plantilla.

Tenga en cuenta que las macros no tienen acceso a las variables de plantilla actuales , por lo que intentar acceder logged_inen el código de una macro no tendría ningún efecto.
Entre los archivos de plantilla utilizados de los módulos principales de Drupal, los que usan una macro son:

  • 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 ejemplo, cambiar la última macro con el siguiente código no tendría el 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
fuente
The variable is surely available in all the template filesMe temo que te equivocas con respecto a esto. Si la plantilla no lo menciona en los comentarios, debe haber una razón, ¿verdad? Porque probé en menu.html.twig (que no lo menciona en los comentarios) y no funcionó. Mientras usa Twig Extender funciona.
No Sssweat
_template_preprocess_default_variables()se llama para todas las salidas de plantilla de Drupal, por lo que las variables que agrega están presentes en todos los archivos de plantilla. La documentación no documenta todas las variables predeterminadas, por lo que puedo ver.
kiamlaluno
2
@kiamlaluno cada vez que tenga tiempo libre, pruebe {% if logged_in %}en menu.html.twig y verá que no funciona. No funciono para mi.
No Sssweat
6

Puedes hacerlo con el módulo Twig Extender . Cita de su página de proyecto:

Agregue un sistema de complemento simple para agregar nuevas extensiones de ramita (Filtro y Funciones). Proporciona un nuevo proveedor de servicios para "twig.extensions" para agregar nuevos complementos.

Función: is_user_logged_in

Compruebe si el usuario ha iniciado sesión.

{% if user_is_logged_in() %}
Hello user
{% else %}
Please login
{% endif %}
No Sssweat
fuente
solo 57 uso y beta :(. tal vez la mejor solución es `$ vars ['is_login'] =! \ Drupal :: currentUser () -> isAnonymous ();` en preprocess_page? ¿Cuál es su opinión?
Yusef
2
No hay necesidad de un módulo para esa funcionalidad, ya que Drupal core ya lo tiene. Mira mi respuesta.
kiamlaluno
@kiamlaluno Sí, estoy de acuerdo con usted, este requisito es muy popular y estaba seguro de que Drupal le había proporcionado algo.
Yusef
1

Para todos los que intenten usar logged_indesde menu.twig.html; debe llamarlo desde fuera de la menus.menu_links()macro ya que la logged_invariable está fuera del alcance dentro de la macro.

Freddy Amsterdam
fuente
1

Puede verificar si el usuario está autenticado así:

Por ejemplo, he creado la siguiente función en 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;
  }
}

Después de eso, puede crear la lógica dentro del archivo Twig de la siguiente manera:

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

Si el usuario ha iniciado sesión, recibirá el mensaje de saludo junto con el nombre de usuario, el correo electrónico y la imagen de avatar. Si el usuario no ha iniciado sesión, no mostrará nada.

Avíseme si eso ayuda y / o si puedo editar esta publicación para una mejor comprensión.

Manuel Abascal
fuente