Wie bekomme ich Nodeid?


7

Wie erhalte ich die Knoten-ID in Drupal für die aktuelle Seite, ohne die Informationen aus der Seiten-URL zu verwenden? Dh:

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

Ich möchte den obigen Ansatz nicht verwenden.

Antworten:


16

Kommt immer noch indirekt über die URL, aber dies ist der einfachste Weg, um sie zu erhalten: menu_get_object .

<?
if ($node = menu_get_object()) {
 $nid = $node->nid;
}
?>

Beachten Sie, dass ein vorhandener Knoten ohnehin bereits vom Menüsystem geladen wurde und dieser aus dem statischen Cache geladen wird.


2
Beachten Sie, dass dieser Ansatz sicherstellt, dass die Knoten-ID gültig ist und der Benutzer Zugriff darauf hat.

Ich habe versucht, menu_get_object, aber es bekommt keine der Knotenattribute

2
Definieren Sie "Knotenattribute". menu_get_object () gibt das vollständige $ node-Objekt zurück, wenn Sie einen Knoten anzeigen. Wenn Sie versuchen, den $ -Knoten woanders
abzurufen,

2
Dieser Ansatz stellt sicher, dass die ID gültig und zugänglich ist, wie @chx hervorhebt. Kann aber auch sehr schwer sein: Es kommt oft zu vielen DB-Aufrufen. Erst letzte Woche habe ich eine $node = menu_get_object()Frage ersetzt, die der ursprünglichen Code-Frage ähnelt, und mehr als 500 Datenbankanforderungen pro Seite gespeichert . Vorsichtig verwenden!
berkes

1
berkes, menu_get_object löst nur einen Node_load aus, der statisch zwischengespeichert ist und auf einer Knotenseite bereits vorhanden sein sollte. Auch mehr als 500 dB Anfrage für eine einzelne Knotenlast? Ich finde das schwer zu glauben ... da stimmt etwas nicht.

1

Sofern es keinen technischen Grund gibt, warum die arg () -Methode nicht verfügbar ist (oder Sie den Zugriff wie in anderen Posts überprüfen MÜSSEN), ist die arg () -Methode die einfachste und schnellste.

Wenn Sie dann zusätzliche Eigenschaften benötigen, können Sie node_load () ausführen, um die ID abzurufen. Angenommen, Sie versuchen, den aktuellen Knoten abzurufen, hat dies so gut wie keinen Leistungseinbruch.


0

Sie können die ID des Knotens durch Aufrufen erhalten $node->nid. In der Tat ist es nicht die beste Lösung, die ID von der URL zu erhalten, da Sie eines Tages möglicherweise zu SEO-freundlicheren URLs wechseln.

Aus dieser Dokumentation geht hervor , dass sie $nodein definiert ist page.tpl.phpund daher für Sie verfügbar sein sollte.

<?php
  // In a template file...

  if ($node) {
    echo $node->nid;
  }
  else {
    // you are viewing taxonomy, view, etc
  }
?>

Ich muss außerhalb der Vorlagendatei darauf zugreifen.

Wo möchten Sie von einem Modul aus darauf zugreifen? In welchem ​​Kontext sprechen wir von der "aktuellen Seite"?
Zourtney

Es sollte beachtet werden, dass, wenn die 'interne' URL Knoten / 12 ist und Sie den Pfad verwenden, um eine saubere URL zu erstellen, der ursprüngliche Code weiterhin funktioniert. Dies liegt daran, dass der Drupal-Knoten / 12-Pfad für das System immer noch die URL ist.
Mirzu

0

Der einfachste Weg, dies in Drupal 8 zu tun:

$path_args = explode('/', current_path());
print $path_args[1];

0

Ein weiterer ziemlich direkter und zuverlässiger Ansatz in D7 wäre

<?php
if (isset($node->nid) && count($node->nid) > 0){
  $nodeid = $node->nid;
}
?>

Zourtneys Vorschlag verursacht in meinem Fall einen undefinierten Indexfehler.


0

Ja, das hat mich ewig verwirrt, aber die Verwendung des Arg-Arrays sollte unter fast allen Umständen funktionieren, und Drupal kümmert sich um die Konvertierung von der tatsächlichen URL, die durch Pfad oder Pathauto erstellt wurde .

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.