web-dev-qa-db-fra.com

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

Existe-t-il une fonction Drupal API comme node_load() qui retournera une liste de nœuds par un type donné?

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

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

37
gmercer

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

Il n'y a pas une telle API pour Drupal 6. Le plus proche que vous pouvez faire est de rechercher correctement tous les ID de nœud pour le type de contenu, puis de charger chacun à l'aide de node_load (), mais cela nécessitera n + 1 interroge 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_sql assurera le contrôle d'accès et le filtrage fourni par un autre module (tel que le filtrage linguistique fourni par le module i18n).

Pour Drupal 7, vous pouvez utiliser $nodes = node_load_multiple(array(), array('type' => $type)); mais l'argument $conditions De node_load_multiple() est déconseillé. Au lieu de cela , vous devez utiliser EntityFieldQuery pour rechercher les ID de nœud, puis utiliser node_load_multiple() mais sans l'argument $condition.

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']));
}
13
Pierre Buyle

Il y a déjà plusieurs bonnes réponses, mais elles prennent la question au pied de la lettre et se réfèrent uniquement aux nœuds.

Étant donné que D6 n'a pas d'API pour faire ce qui est demandé et qu'il n'est pas nécessaire de se limiter aux nœuds dans D7 et avant, 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[$]));
}
7
Letharion

Récupère 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 vous sera utile.

1
Nitesh Sethia

drupal 8:

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