Gibt es eine Möglichkeit festzustellen, ob die aktuelle Seite ein Knoten ist?

7

Ohne die URL zu überprüfen, möchte ich wissen, ob die aktuelle Seite eine Knotenseite ist. Wir planen die Verwendung von URL-Aliasen, daher möchten wir uns nicht auf die Struktur '/ node / *' verlassen.

Gibt es eine Seitenvariable oder etwas, das auf eine Knotenseite hinweist?

BrandenB171
quelle

Antworten:

14
\Drupal::request()->attributes->get('node');

Entnommen von hier: https://api.drupal.org/api/drupal/core!lib!Drupal.php/function/Drupal%3A%3Arequest/8

Jetzt sagen die Dokumente, dass diese Funktion niemals verwendet werden soll, aber ich habe sie verwendet, um festzustellen, auf welcher Art von Seite ich mich befinde.

Es gibt noch eine andere Funktion, aber ich bin nicht sicher, ob sie in Ihrem Fall zutrifft:

https://api.drupal.org/api/drupal/core%21modules%21node%21node.module/function/node_is_page/8

Wenn Sie keine Entität haben, können Sie dies zumindest in Ihrem Code nachahmen:

  $route_match = \Drupal::routeMatch();

  if ($route_match->getRouteName() == 'entity.node.canonical') {
    return true;
  }
Kevin
quelle
1
Die Überprüfung des Routennamens ist in Ordnung, verwenden Sie jedoch nicht das Knotenattribut. Dies ist auch auf vielen anderen Seiten vorhanden, z. B. auf einem Knotenbearbeitungsformular, Revisionsübersichten usw. Jemand könnte sogar mit deinem Kopf
herumspielen
Ich brauchte dieses Plus $route_match->getRouteName() == 'entity.node.revision', um auch an Revisionen zu arbeiten.
Leymannx
6

In Ihrem eigenen Modul denke ich, ist der empfohlene Weg

$node = \Drupal::routeMatch()->getParameter('node');
if ($node instanceof \Drupal\node\NodeInterface) {
  // It's a node!
}
GiorgosK
quelle
5

In der Seitenvorlage ist bereits eine Variable für den Knoten verfügbar, die Sie in twig verwenden können.

Um festzustellen, ob die aktuelle Seite ein Knoten ist, können Sie überprüfen, ob nodeFolgendes vorhanden ist:

page.html.twig

{% if node %}
  <h1>This is a node</h1>
{% endif %}

Dies ist möglich, da sich dieser Code im Kern befindet:

core/includes/theme.inc:
function template_preprocess_page(&$variables) {
  ...
  if ($node = \Drupal::routeMatch()->getParameter('node')) {
    $variables['node'] = $node;
  }
}

Dies funktioniert für / node / [id] - und URL-Aliase.

4k4
quelle
Zu welchem ​​Thema findest du das, weil ich das in Bartik nicht gesehen habe?
BrandenB171
Dies ist kein Haken in einem Thema, dies ist Teil des Vorprozesses im Kern, siehe core/includes/theme.inc.
4k4
0

Die aktuellen Antworten funktionieren nicht für Vorschauen oder Überarbeitungen. Normalerweise möchten Sie jedoch, dass diese Logik auch bei Voransichten oder Überarbeitungen ausgelöst wird. Besonders auf der Themenebene, wo Sie bestenfalls sehen sollten, wie der Knoten aussehen wird, nachdem er gespeichert und / oder veröffentlicht wurde.

Hier ist also ein Ausschnitt, der den aktuellen Knoten abruft, unabhängig davon, ob Sie den vollständigen Knoten oder seine Vorschau oder seine Revision anzeigen. Dies kann in eine Hilfsfunktion gestellt werden, unter MYMODULE/src/Utilsder zugegriffen werden kann oder um es zu einem Dienst zu machen.

$node = FALSE;
$route_match = \Drupal::routeMatch();

if ($route_match->getRouteName() == 'entity.node.canonical') {
  $node = $route_match->getParameter('node');
}
elseif ($route_match->getRouteName() == 'entity.node.revision') {
  $revision_id = $route_match->getParameter('node_revision');
  $node = node_revision_load($revision_id);
}
elseif ($route_match->getRouteName() == 'entity.node.preview') {
  $node = $route_match->getParameter('node_preview');
}

return $node;

Übrigens gilt das Gleiche für die node_is_page()Funktion, die derzeit bei Revisionen oder Vorschauen nicht funktioniert. Ich habe bereits ein Problem geöffnet und einen Patch unter https://www.drupal.org/project/drupal/issues/3005029 bereitgestellt .

Leymannx
quelle