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?

silkAdmin
quelle
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.

kiamlaluno
quelle
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.

Bart
quelle
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];
iStryker
quelle
3
arg(1);

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

Jeremy French
quelle
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();
oknate
quelle