Controlla se l'utente ha effettuato l'accesso in un tema


16

In Drupal 7 possiamo semplicemente verificare se l'utente corrente ha effettuato l'accesso a un tema controllando $GLOBAL['user']->uido utilizzando user_is_logged_in().

Come posso verificare se un utente ha effettuato l'accesso in un modello di pagina, in Drupal 8?

Una soluzione è quella di effettuare il check-in manualmente hook_preprocess_page(), ma poiché è molto popolare, penso che Drupal fornisca qualcosa per impostazione predefinita per il motore dei temi di Twig.

Risposte:


26

Se si desidera solo verificare che l'utente corrente abbia effettuato l'accesso, è possibile utilizzare $variables['logged_in'], che è generalmente disponibile in tutti i file modello.

Ad esempio, il file mark.html.twig utilizza il seguente codice, sebbene l'unica variabile documentata sia 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 variabile è esplicitamente documentata in altri file modello, come html.html.twig , page.html.twig e node.html.twig .

La variabile è disponibile in tutti i file modello, poiché è inizializzata in _template_preprocess_default_variables()quello invoke user_template_preprocess_default_variables_alter()(un'implementazione di hook_template_preprocess_default_variables_alter()), che contiene il seguente codice.

  $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()viene chiamato da template_preprocess(), che è la funzione chiamata per gli hook dei temi implementati come template; questo garantisce che la variabile sia disponibile in tutti i file modello.

Tieni presente che le macro non hanno accesso alle variabili del modello corrente , quindi il tentativo di accedere logged_inal codice di una macro non avrebbe alcun effetto.
Tra i file modello utilizzati dai moduli core di Drupal, quelli che utilizzano una macro sono:

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

Ad esempio, la modifica dell'ultima macro con il seguente codice non avrebbe il risultato previsto.

{% 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 filesTemo che tu abbia torto riguardo a questo. Se il modello non lo menziona nei commenti, ci deve essere un motivo, giusto? Perché ho provato su menu.html.twig (che non lo menziona nei commenti) e non ha funzionato. Durante l'utilizzo di Twig Extender funziona.
No Sssweat,

_template_preprocess_default_variables()viene chiamato per ogni output Drupal modello, quindi le variabili che aggiunge sono presenti in tutti i file modello. La documentazione non documenta tutte le variabili predefinite, per quanto posso vedere.
kiamlaluno

2
@kiamlaluno ogni volta che hai tempo libero, prova {% if logged_in %}menu.html.twig e vedrai che non funziona. Non ha funzionato per me.
No Sssweat,

6

Puoi farlo con il modulo Twig Extender . Citazione dalla sua pagina del progetto:

Aggiungi un semplice sistema di plugin per aggiungere nuove estensioni ramoscello (Filtro e funzioni). Fornisce un nuovo fornitore di servizi per "twig.extensions" per aggiungere nuovi plugin.

Funzione: is_user_logged_in

Controlla se l'utente ha effettuato l'accesso.

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

solo 57 use e beta :(. forse la soluzione migliore è `$ vars ['is_login'] =! \ Drupal :: currentUser () -> isAnonymous ();` in preprocess_page? qual è la tua opinione?
Yusef

2
Non è necessario un modulo per quella funzionalità, poiché Drupal core lo possiede già. Vedi la mia risposta
kiamlaluno

@kiamlaluno Sì, sono d'accordo con te, questo requisito è molto popolare ed ero sicuro che Drupal ci avesse fornito qualcosa.
Yusef,

1

Per tutti coloro che cercano di utilizzare logged_inda menu.twig.html; è necessario chiamarlo dall'esterno della menus.menu_links()macro poiché la logged_invariabile non rientra nell'ambito della macro.


1

Puoi verificare se l'utente è autenticato in questo modo:

Ad esempio, ho creato la seguente funzione in 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;
  }
}

Successivamente, puoi creare la logica all'interno del file Twig in questo modo:

<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 l'utente ha effettuato l'accesso, riceverai il messaggio di saluto insieme a nome utente, email e immagine avatar. Se l'utente non ha effettuato l'accesso, non mostrerà nulla.

Fammi sapere se questo aiuta e / o se posso modificare questo post per una migliore comprensione.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.