it-swarm.com.de

Wie erhalte ich die Knoten-ID von der URL?

Bisher bin ich auf diese 3 Funktionen in Drupal 7) gestoßen, aber ich bin mir nicht sicher, was der Unterschied zwischen ihnen ist und welche besser geeignet ist, um die Knoten-ID in einer Blockvorverarbeitungsfunktion zu erhalten .

Kannst du mir einen Einblick geben?

47
silkAdmin

Ich bin mir nicht sicher, was der Unterschied zwischen ihnen ist

  • menu_get_object () gibt das Objekt zurück, das der aktuell angezeigten Seite zugeordnet ist. Wenn der Code ausgeführt wird, wenn Drupal zeigt die Seite example.com/node/1 an, gibt menu_get_object() das Knotenobjekt für den Knoten zurück, dessen ID 1 ist; if Die angezeigte Seite ist example.com/user/1. Dann gibt menu_get_object('user') das Benutzerobjekt für den Benutzer zurück, dessen ID 1 ist.
  • menu_get_item () gibt ein Array zurück, das einen Index für jedes Feld in der Tabelle "menu_router" enthält. Das beinhaltet:
    • pfad: Der aktuelle Pfad des Menü-Rückrufs
    • load_functions: Ein Array von Funktionsnamen (wie node_load), die aufgerufen werden sollen, um ein Objekt zu laden, das einem Teil des aktuellen Pfads entspricht
    • access_callback: Der Rückruf, der prüft, ob der aktuell angemeldete Benutzer Zugriff auf den Menüpunkt hat
    • page_callback: Der Name der Funktion, die die Seite rendert
    • titel: Der Titel der Seite, die dem Menüelement zugeordnet ist
  • drupal_lookup_path () ist die Funktion, die Ihnen den internen Pfad zurückgibt, der dem als Argument übergebenen Alias ​​zugeordnet ist. Wenn "homepage" der Alias ​​ist, der example.com/node/1 zugeordnet ist, gibt drupal_lookup_path("homepage")"node/1" zurück. Pfad-Aliase können beliebigen internen Pfaden zugeordnet werden, nicht nur Knotenpfaden.

und welches besser geeignet ist, um die Knoten-ID in einer Blockvorverarbeitungsfunktion zu erhalten.

Wenn Sie nur die Knoten-ID des aktuell angezeigten Knotens erhalten möchten, müssen Sie nur den folgenden Code verwenden:

if (arg(0) == 'node') {
  $nid = arg(1);
}

Wenn Sie das Knotenobjekt abrufen müssen, können Sie den folgenden Code verwenden:

if ($node = menu_get_object()) {
  // Use the node object.
}

Von diesen Snippets ist das zweite besser, da es das richtige Knotenobjekt für interne Pfade wie Knoten/1/Revisionen/3/Ansicht zurückgibt.

Beachten Sie, dass einige Vorverarbeitungsfunktionen, z. B. die für die Seite oder den Knoten, bereits ein $variables['node'] haben. Dies bedeutet, dass Sie in diesen Fällen nur das folgende Snippet in Ihrer Vorverarbeitungsfunktion verwenden müssen, ohne sich Gedanken darüber zu machen, welche Funktion verwendet werden soll.

if (isset($variables['node'])) {
  // Check the node ID or other properties.
}

Überprüfen Sie für andere Vorverarbeitungsfunktionen die Dokumentation, um festzustellen, ob eine Variable das Knotenobjekt enthält. Dies ist beispielsweise bei template_preprocess_comment() der Fall, wodurch $variables['node'] den Vorverarbeitungsfunktionen für Kommentare zur Verfügung steht.

63
kiamlaluno

Wie es gemacht wird in Drupal Core's template_preprocess_page :

Zeile 2267 von theme.inc und weiter:

if ($node = menu_get_object()) {
    $variables['node'] = $node;
}

template_preprocess_page verwendet menu_get_object . Danach müssen Sie nur noch prüfen, ob der Knoten definiert ist, und $ node-> nid abrufen.

7
Bart

Eine Sache, auf die Sie achten müssen, ist der Pfadalias.

drupal_get_normal_path($path)

um den aktuellen Pfad zu erhalten, verwenden Sie die Systemvariable $_SERVER["REQUEST_URI"]

(Wenn Sie sich auf der Knotenseite befinden, die Sie $node->uri['path'] Aufrufen können, wird ein Nicht-Alias-Pfad zurückgegeben. Wenn Sie sich auf der Knotenseite befinden, können Sie einfach $node->nid Verwenden.)

dies gibt den Knoten/XXXX zurück

also versuchen Sie so etwas

  $node_path = explode('/', drupal_get_normal_path($path));
  $nid = $node_path[1];
4
iStryker
arg(1);

Ist keine schlechte Art, es zu tun. arg () funktioniert auf dem internen Pfad, sodass er nicht von Pfadaliasnamen beeinflusst wird.

3
Jeremy French

In Drupal 8) können Sie URL-Argumente basierend auf dem Inhalt des Routings abrufen.

Um die ID alleine zu bekommen:

$nid = \Drupal::routeMatch()->getRawParameter('node');

Wenn Sie das Knotenobjekt laden möchten, können Sie es einfach folgendermaßen abrufen:

$node = \Drupal::routeMatch()->getParameter('node');

Um die Parameternamen zu finden, können Sie Folgendes verwenden:

$possible_parameters = \Drupal::routeMatch()->getParameters();
2
oknate