Gibt es eine Drupal-API-Funktion, um die Liste der Knoten nach Typ abzurufen?

35

Gibt es eine solche Drupal-API-Funktion node_load(), die eine Liste von Knoten eines bestimmten Typs zurückgibt?

Ich habe es versucht $nodes = node_load(array("type" => 'student_vote')), aber es gibt nur einen Knoten zurück.

Ich weiß, dass ich so etwas programmieren könnte node_load(), aber ich wollte sehen, ob es so etwas schon gibt.

Gmercer
quelle

Antworten:

45

Abhängig von der Version von Drupal:

Drupal 6:

$nodes = db_query('SELECT nid FROM {node} WHERE type="%s"', $type);

Drupal 7:

$nodes = node_load_multiple(array(), array('type' => $type));

Drupal 8:

$nids = \Drupal::entityQuery('node')
  ->condition('type', 'NODETYPE')
  ->execute();
$nodes = \Drupal::entityTypeManager()
  ->getStorage('node')
  ->loadMultiple($nids);
Nikit
quelle
Ja, das würde funktionieren.
Muneer
6
Beachten Sie, dass das Array $ conditions nicht mehr unterstützt wird und in Drupal 8 entfernt wird. Aus Gründen der zukünftigen Kompatibilität ist es besser, EntityFieldQuery ( api.drupal.org/api/drupal/includes%21entity.inc/class/… ) zu verwenden Rufen Sie die Knoten-IDs ab und übergeben Sie diese an das erste Argument von node_load_multiple (). Hier gibt es ein gutes Tutorial: drupal.org/node/1343708
Bala Clark
1
Aus Gründen der Übersichtlichkeit ist EntityFieldQuery () in Drupal 8 nicht mehr enthalten.
Elijah Lynn
13

Für Drupal 6 gibt es keine solche API. Am besten fragen Sie alle Knoten-IDs für den Inhaltstyp ab und laden sie dann mit node_load (). Dies erfordert jedoch n + 1 Abfragen und ist nicht sehr effizient.

function node_load_by_type($type, $limit = 15, $offset = 0) {
  $nodes = array();
  $query = db_rewrite_sql("SELECT nid FROM {node} n WHERE type = '%s'", 'n');
  $results = db_query_range($query, $type, $offset, $limit);
  while($nid = db_result($results)) {
    $nodes[] = node_load($nid);
  }
  return $nodes;
}

Hinweis: db_rewrite_sqlStellt die Zugriffskontrolle und andere vom Modul bereitgestellte Filter sicher (z. B. die vom i18n-Modul bereitgestellte Sprachfilterung).

Für Drupal 7 können Sie verwenden, $nodes = node_load_multiple(array(), array('type' => $type));aber das $conditionsArgument von node_load_multiple()ist veraltet. Verwenden Sie stattdessen EntityFieldQuery , um die Knoten-IDs abzufragen , und verwenden Sie dann, node_load_multiple()jedoch ohne ein $conditions-Argument.

function node_load_by_type($type, $limit = 15, $offset = 0) {
  $query = new EntityFieldQuery();
  $query->entityCondition('entity_type', 'node')
    ->entityCondition('bundle', $type)
    ->range($offset, $limit);
  $results = $query->execute();
  return node_load_multiple(array_keys($results['node']));
}
Pierre Buyle
quelle
Wenn Sie in D6 eine node_load () wie folgt ausführen: node_load (array ('type' => 'page')), erhalten Sie ein Array aller Seitenknoten.
Blake Senftner
@bsenftner node_load (Array ('type' => 'page')) gibt nur einen Knoten zurück.
Chim
7

Es gibt bereits mehrere gute Antworten, aber sie nehmen die Frage wörtlich und beziehen sich nur auf Knoten.

Da D6 keine API hat, um das zu tun, wonach gefragt wird, und es nicht notwendig ist, sich auf Knoten in D7 und höher zu beschränken, sollte eine gute Antwort Entity-generisch sein.

function entity_load_by_type($entity_type, $bundle, $limit = 10, $offset = 0) {
  $query = new EntityFieldQuery();
  $query->entityCondition('entity_type', $entity_type)
    ->entityCondition('bundle', $bundle)
    ->range($offset, $limit);
  $results = $query->execute();
  return entity_load($entity_type, array_keys($results[$]));
}
Letharion
quelle
Ich wollte eine Antwort hinzufügen EntityFieldQuery, aber du hast deine bereits geschrieben. Ich möchte nur hinzufügen, dass das zweite Argument von user_load_multiple()seit Drupal 7 veraltet ist und der verwendete Code der von Ihnen gezeigte sein sollte.
Kiamlaluno
Ich dachte, ich müsste nicht einmal mit veralteten Argumenten auf die alten Versionen verweisen, da ich nur "entity_load" verwendet habe. Auf diese Weise besteht "kein" Risiko, dass Personen versehentlich die veraltete Funktionalität verwenden. Oder sind Sie damit nicht einverstanden?
Letharion
1
meinst du array_keys($results[$entity_type])?
Commonpike
@commonpike Höchstwahrscheinlich ja. Ich habe im Moment keine Möglichkeit, dies zu überprüfen, kann es aber jederzeit ändern und korrigieren, wenn Sie es ausprobieren. :)
Letharion
Ich tat etwas etwas anderes und musste spezifizieren entity_load($entity_type, array_keys($results['node']));. Havent testete es für andere Entitäten ..
Commonpike
1

Drupal 8:

$nids = \Drupal::entityQuery('node')
  ->condition('type', 'student_vote')
  ->execute();
$nodes = \Drupal::entityTypeManager()
  ->getStorage('node')
  ->loadMultiple($nids);
Andrea
quelle
1

Ruft die Liste der Knoten von einem Inhaltstyp ab

Drupal 6:

$nodes = db_query('SELECT nid FROM {node} WHERE type="%s"', 'student_vote');

Drupal 7:

$nodes = node_load_multiple(array(), array('type' => 'student_vote'));

Drupal 8:

$nids = \Drupal::entityQuery('node')
  ->condition('type', 'student_vote')
  ->execute();
$nodes = \Drupal::entityTypeManager()
  ->getStorage('node')
  ->loadMultiple($nids);

Hoffe das wäre hilfreich.

Nitesh Sethia
quelle
Was ist in Ihrer Antwort anders als in der obigen Antwort ? Es ist genau das gleiche.
Елин Й.