Existe-t-il une fonction API Drupal pour obtenir la liste des nœuds par type?

35

Existe-t-il une fonction API Drupal comme node_load()celle qui renverra une liste de nœuds d'un type donné?

J'ai essayé $nodes = node_load(array("type" => 'student_vote')), mais il ne retourne qu'un seul noeud.

Je sais que je pourrais coder quelque chose comme ça node_load(), mais je voulais voir s'il y avait déjà quelque chose comme ça là-bas.

gmercer
la source

Réponses:

45

Selon la version de 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
la source
Oui, cela fonctionnerait.
Muneer
6
Gardez à l'esprit que le tableau $ conditions est amorti et sera supprimé de Drupal 8. Pour une compatibilité future, il serait préférable d'utiliser EntityFieldQuery ( api.drupal.org/api/drupal/includes%21entity.inc/class/… ) pour récupérez les identifiants de nœud, puis transmettez-les au premier argument de node_load_multiple (). Il y a un bon tutoriel ici: drupal.org/node/1343708
Bala Clark
1
Pour plus de clarté, EntityFieldQuery () n'est plus dans Drupal 8.
Elijah Lynn
13

Il n’existe pas d’API de ce type pour Drupal 6. Le plus simple que vous puissiez faire est d’interroger correctement tous les ID de nœuds pour le type de contenu, puis de les charger chacun à l’aide de node_load (), mais cela nécessitera n + 1 requêtes et n’est pas très efficace.

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;
}

Remarque: db_rewrite_sqlassurera la vérification de l'accès et le filtrage fourni par d'autres modules (tels que le filtrage de la langue fourni par le module i18n).

Pour Drupal 7, vous pouvez utiliser $nodes = node_load_multiple(array(), array('type' => $type));mais l’ $conditionsargument de node_load_multiple()est obsolète. Au lieu de cela, vous devez utiliser EntityFieldQuery pour rechercher les ID de nœud, puis les utiliser, node_load_multiple()mais sans $conditionargument s.

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
la source
En fait, si vous faites un node_load () dans D6 comme ceci: node_load (array ('type' => 'page')), vous obtiendrez tout un tableau de tous les nœuds de page.
Blake Senftner
@bsenftner node_load (array ('type' => 'page')) ne renvoie qu'un seul noeud.
chim
7

Il y a déjà plusieurs bonnes réponses, mais elles prennent la question à la lettre et ne font référence qu'aux nœuds.

Étant donné que D6 ne dispose pas d'une API pour faire ce qui est demandé, et qu'il n'est pas nécessaire de se limiter aux nœuds de D7 et de transmission, je pense qu'une bonne réponse devrait être une entité générique.

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
la source
J'allais ajouter une réponse à propos de EntityFieldQuery, mais vous avez déjà écrit la vôtre. J'ajouterais simplement que le deuxième argument de user_load_multiple()a été déconseillé depuis Drupal 7, et que le code utilisé devrait être celui que vous montrez.
kiamlaluno
J'ai pensé que je n'avais même pas besoin de faire référence aux anciennes versions avec des arguments désapprouvés puisque je venais tout juste d'utiliser entity_load. De cette façon, il n’ya "pas" de risque que des personnes finissent par utiliser accidentellement la fonctionnalité obsolète. Ou êtes-vous en désaccord avec cela?
Letharion
1
Vouliez-vous dire array_keys($results[$entity_type])?
Commonpike
@commonpike Très probablement, oui. Je n'ai pas l'occasion de vérifier pour le moment, mais n'hésitez pas à le modifier et à le corriger si vous le testez. :)
Letharion
Je faisais quelque chose de légèrement différent et je devais préciser entity_load($entity_type, array_keys($results['node']));. Havent l'a testé pour d'autres entités ..
commonpike
1

drupal 8:

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

Obtenir la liste des nœuds d'un type de contenu

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);

J'espère que cela serait utile.

Nitesh Sethia
la source
Qu'est-ce qui diffère dans votre réponse par rapport à la réponse ci - dessus ? c'est exactement le meme.
Елин Й.