Wie lade ich einen Knoten anhand seines Titels?


32

Ich kenne nur den Titel eines Knotens und möchte den Knoten mit laden node_load().

Wie mache ich das?


Wenn es sich um eine normale Seite handelt, sollte die NID arg(1)für alle Seiten Node / X sein. und node_load()arbeitet nur an NID
GoodSp33d

meine url ist projects / {username} / {
knotentitel

In Drupal 7 können Sie node_load () nicht verwenden, um den Knoten nach seinem Titel abzurufen, sondern nur nach nid
abd

Sind Ihre Titel einzigartig?
Artur

Antworten:


17

In Drupal 6 können Sie den folgenden Code verwenden.

$node = node_load(array('title' => 'node title'));

Wenn Sie auch den Knotentyp kennen, können Sie den folgenden Code verwenden.

$node = node_load(array('title' => 'node title', 'type' => 'page'));

node_load () gibt immer einen einzelnen Knoten zurück. Dies liegt daran, dass die Funktion die von db_query () zurückgegebene Datenbank-Abfrageergebnisressource nicht durchläuft .

  if ($revision) {
    array_unshift($arguments, $revision);
    $node = db_fetch_object(db_query('SELECT ' . $fields . ' FROM {node} n INNER JOIN {users} u ON u.uid = n.uid INNER JOIN {node_revisions} r ON r.nid = n.nid AND r.vid = %d WHERE ' . $cond, $arguments));
  }
  else {
    $node = db_fetch_object(db_query('SELECT ' . $fields . ' FROM {node} n INNER JOIN {users} u ON u.uid = n.uid INNER JOIN {node_revisions} r ON r.vid = n.vid WHERE ' . $cond, $arguments));
  }

3
@sokratis Beachten Sie, dass Titel nicht eindeutig sein müssen und jederzeit geändert werden können. Wenn Sie zur Referenzierung nach Knoten-ID wechseln können, ist dies sicherer.
David L

4
Drupal ist kein Fan von CamelCase.
Sivaji

1
Dieses Beispiel funktioniert auch in D7 einfach nicht. node_load(). Frage-Tag bearbeitet, um dies widerzuspiegeln.
Chapabu

3
D7-Version (wenn auch mit dem veralteten $conditionsParameter):$nodes = node_load_multiple(array(), array('title' => 'node title'));
Clive

47

In Drupal 7 wurden die Parameter für node_load()geändert. Um die Knoten zu ermitteln, die bestimmten Bedingungen entsprechen, sollten Sie die EntityFieldQuery- Klasse verwenden.

$query = new EntityFieldQuery();


 $entities = $query->entityCondition('entity_type', 'node')
  ->propertyCondition('type', 'your_node_type')
  ->propertyCondition('title', 'your node title')
  ->propertyCondition('status', 1)
  ->range(0,1)
  ->execute();

  if (!empty($entities['node'])) {
    $node = node_load(array_shift(array_keys($entities['node'])));
  }

1
node_load (array ('title' => 'node title', 'type' => 'page') - dies wird bald veraltet sein, daher ist diese Antwort korrekt.
Nikit

1
Dies ist so lang, um einen einzelnen Knoten zu laden; /
Kenorb

12

Drupal 7

Hier ist ein einfacherer Weg (wie bereits von Clive und bei SO vorgeschlagen ):

$nodes = node_load_multiple(NULL, array("title" => "Foo Bar"));
$node = current($nodes);

und viel einfacher zu merken als die Verwendung der EntityFieldQuery- Klasse.

Siehe auch: Programmgesteuertes Abrufen von Knoten nach Titel in Drupal 7 bei SO


1
Dies sollte die akzeptierte Antwort sein!
Alex Skrypnyk

3
Netter Ansatz, unglücklicherweise mit der Absicht zu sterben, wie in [ api.drupal.org/api/drupal/modules%21node%21node.module/function/… (function node_load_multiple) @todo Remove $conditions in Drupal 8.
August

10

In Drupal 7 können Sie Code verwenden, der dem folgenden ähnelt.

$result = db_query("SELECT n.nid FROM {node} n WHERE n.title = :title AND n.type = :type", array(":title"=> $title, ":type"=> $type));  
$nid = $result->fetchField();

Sie begrüßen: D.
abd

5

Führen Sie in Drupal 8 Folgendes aus:

$nodes = \Drupal::entityTypeManager()
  ->getStorage('node')
  ->loadByProperties(['title' => $title]);
foreach ( $nodes as $node ) {
  $node->doSomething(...);
}

$node wird ein vollständig instanziiertes Knotenobjekt sein.


1

Auch in Drupal 8

$nids = \Drupal::entityQuery('node')
->condition('title', 'YourNodeTitle')
->sort('nid', 'DESC')
->execute();

und als nächstes:

$node = \Drupal\node\Entity\Node::load(HEREYOUNODEID);

Vergiss nicht, dass du brauchst

use Drupal\node\Entity\Node;
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.