Wie erhalte ich die Knoten-ID von der URL?


47

Bisher bin ich auf diese drei Funktionen in Drupal 7 gestoßen, aber ich bin mir nicht sicher, was der Unterschied zwischen ihnen ist und was besser geeignet ist, um die Knoten-ID in einer Block-Vorverarbeitungsfunktion abzurufen.

Kannst du mir einen Einblick geben?


Machst du das in node.tpl.php oder so? Wenn ja, könnten Sie $ node-> nid verwenden.
Bart

Nein, ich mache dies in einer Block-Vorverarbeitungsfunktion, obwohl der Block auf der Knotenseite gedruckt wird.
SilkAdmin

Antworten:


63

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, während Drupal die Seite example.com/node/1 anzeigt, menu_get_object()wird das Knotenobjekt für den Knoten mit der ID 1 zurückgegeben. Wenn die angezeigte Seite example.com/user/1 lautet, menu_get_object('user')wird das Benutzerobjekt für den Benutzer mit der ID 1 zurückgegeben.
  • menu_get_item () gibt ein Array zurück, das einen Index für jedes in der Tabelle "menu_router" enthaltene Feld enthält. Das beinhaltet:
    • Pfad: Der aktuelle Pfad des Menü-Rückrufs
    • load_functions: Ein Array von Funktionsnamen (like 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, mit der die Seite gerendert wird
    • title: Der Titel der Seite, die dem Menüelement zugeordnet ist
  • drupal_lookup_path () ist die Funktion, die den internen Pfad zurückgibt, der dem als Argument übergebenen Alias ​​zugeordnet ist. Wenn "homepage" der mit example.com/node/1 verknüpfte Alias ​​ist, drupal_lookup_path("homepage")wird zurückgegeben "node/1". Pfadaliase können mit beliebigen internen Pfaden verknüpft werden, nicht nur mit Knotenpfaden.

und welches geeigneter 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 node / 1 / revisions / 3 / view zurückgibt.

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

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. Zum Beispiel ist das der Fall für template_preprocess_comment()das macht $variables['node']die Vorprozess Funktionen für Kommentare zur Verfügung.


7

So geht's in der template_preprocess_page von Drupal Core :

Zeile 2267 von theme.inc und weiter:

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

template_preprocess_page verwendet menu_get_object . Danach muss nur noch geprüft werden, ob der Knoten definiert ist und $ node-> nid abgerufen werden.


4

Eine Sache, auf die Sie achten müssen, ist der Pfad-Alias.

drupal_get_normal_path($path)

Verwenden Sie die Systemvariable, um den aktuellen Pfad abzurufen $_SERVER["REQUEST_URI"]

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

Dadurch wird node / XXXX zurückgegeben

also probier sowas aus

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

3
arg(1);

Ist keine schlechte Art, es zu tun. arg () arbeitet mit dem internen Pfad, daher wird es nicht von Pfadaliasen beeinflusst.


Dies ist wahr, es wird nicht durch Pfad-Aliase beeinflusst. Wenn Sie sich jedoch auf node / XXXXX befinden, können Sie einfach $ node-> nid verwenden. @Französisch, wo sonst würden Sie arg (1) verwenden und es würde zurückgeben, was Sie wollen?
iStryker

Wenn Sie sich in einem Modul-Hook befinden, haben Sie keinen Zugriff auf den Knoten. Views-Argumente können ebenfalls ein Beispiel sein.
Jeremy French

Dank jeremy und istryker, ich habe meine Frage aktualisiert , es könnte klarer sein .. Obwohl ich Ihre beiden Lösungen versuchen werde, dank
silkAdmin

1
Es ist eine sehr schlechte Idee, arg () zu verwenden. Sie binden sich an einen Pfad, use menu_get_object(der sich nur umgibt, menu_get_itemdamit das genauso gut ist).

if (arg(0) == 'node' && is_numeric(arg(1)))Dann erhalten Sie arg(1)zu fast 99% eine Node-ID. Sie können aber arg(1)auch viele andere IDs zurückgeben.
Leymannx

2

In Drupal 8 können Sie URL-Argumente abrufen, die auf dem Inhalt des Routings basieren.

Um den Ausweis alleine zu bekommen:

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

Wenn Sie das Knotenobjekt laden möchten, können Sie es einfach auf folgende Weise abrufen:

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

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

$possible_parameters = \Drupal::routeMatch()->getParameters();
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.