it-swarm.com.de

Wie kann überprüft werden, ob der aktuelle Benutzer der Knotenautor in der Knotenvorlage ist?

Ich verwende Drupal 8. Ich möchte überprüfen, ob der Benutzer (anonymer oder protokollierter Benutzer) der Knotenautor in node.html.twig ist, wie unten:

{# node.html.twig #}
  {% if is_author %}
    You are node author
  {% else %}
    You are not node author
  {% endif %}

Die folgenden Codes funktionieren nicht:

/**
 * Implements hook_preprocess_HOOK().
 */
function MYTHENE_preprocess_node(&$variables) {
  $global $user;
  if ($variables['node']->uid == $user->uid) {
    $variables['is_author'] = TRUE;
  }
  else {
    $variables['is_author'] = FALSE;
  }
}

Wie kann ich die Variable 'is_author' in node.html.twig erstellen?

2
Basic
/**
 * Implements hook_preprocess_HOOK() for node.html.twig.
 */
function mytheme_preprocess_node(&$variables) {
   $uid = \Drupal::currentUser()->id();
   $author_id = $variables['node']->getOwner()->id();
   if ($author_id == $uid) {
     $variables['is_author'] = TRUE;
   }
   else {
     $variables['is_author'] = FALSE;
   }
}
1
JImmy

Das Problem mit Ihrem Ansatz und Jimmys Antwort ist, dass dies in der Produktion mit Drupals Standard-Caching nicht funktioniert. Das Snippet, das Sie in die Vorverarbeitungsfunktion eingefügt haben, wird nach der ersten Ausführung einfach zwischengespeichert, bis Sie den Drupal-Cache manuell neu erstellen.

Um es zu reproduzieren, erstellen Sie einfach zwei neue Benutzer, öffnen Sie zwei anonyme Browserfenster und melden Sie sich in jedem als einer der Benutzer an. Erstellen Sie mit dem ersten Benutzer einen Knoten und erstellen Sie den Cache mit drush cr Neu. "Sie sind Knotenautor" wird angezeigt. Fein. Aber jetzt im zweiten Browserfenster angemeldet, wenn der zweite Benutzer den Knoten besucht und Sie auch "Sie sind Knotenautor" sehen. Schlecht. Erst nach drush cr Und einem aktualisierten Browserfenster wird "Sie sind kein Knotenautor" angezeigt. Wenn Sie jetzt zum ersten Benutzer zurückkehren und das Browserfenster aktualisieren, wird "Sie sind kein Knotenautor" angezeigt. Bis Sie den Cache erneut erstellen.

Um das Problem jetzt zu lösen, können Sie stattdessen ein Render-Array bereitstellen und die Kontrolle über die Cache-Kontexte übernehmen.

Fügen Sie in Ihre Knotenvorlage Folgendes ein:

{{ foobar }}

Und in Ihre Themendatei setzen:

/**
 * Implements hook_preprocess_HOOK() for node.html.twig.
 */
function MYTHEME_preprocess_node(&$variables) {

  $variables['foobar'] = [
    '#markup' => '',
    '#cache' => [
      'contexts' => [
        // As we need this piece of markup to be user-sensitive
        // we tell Drupal to vary the output by the 'user' cache context.
        'user',
      ],
    ]
  ];

  // The rest of the logic can stay basically the same.
  $uid = \Drupal::currentUser()->id();
  $author_id = $variables['node']->getOwner()->id();
  if ($author_id == $uid) {
    $variables['foobar']['#markup'] = t('You are node author');
  }
  else {
    $variables['foobar']['#markup'] = t('You are not node author');
  }
}

Weitere Informationen finden Sie unter Cachefähigkeit von Render-Arrays , von wo ich das Beispiel genommen habe.


Beachten Sie, dass dieser Ansatz mit erweitertem serverseitigem Caching (Lack usw.) immer noch nicht funktioniert. Es muss dann Ajaxified bekommen.

1
leymannx