web-dev-qa-db-fra.com

Comment itérer sur tous les nœuds d'un type de contenu

Je veux récupérer des informations à partir d'un champ de tous les nœuds d'un type de contenu spécifique. Je sais comment faire en utilisant un db_query et en obtenant tous les ID de nœud, puis parcourez-les. Ce que je voudrais savoir, c'est s'il existe un autre moyen de contourner cela en utilisant les fonctions drupal.

22
drcelus

Vous pouvez interroger ces informations directement via node_load_multiple()

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

Vous pouvez ajouter autant de conditions de propriété à $conditions array (second argument) comme vous le souhaitez, donc le statut, créé, etc. est également un jeu équitable.

$conditions est techniquement obsolète (j'imagine en faveur de EntityFieldQuery) mais les chances que cette fonctionnalité soit supprimée de Drupal 7 sont pratiquement nulles. Cela casserait trop.

28
Clive

Le noyau Drupal fournit une classe appelée EntityFieldQuery() . Il y a aussi une page de document pratique pour l'utiliser, qui a beaucoup d'exemples. Dans sa forme la plus simple:

$query = new EntityFieldQuery();

$query->entityCondition('entity_type', 'node')
  ->entityCondition('bundle', 'page')
  ->propertyCondition('status', 1);

$result = $query->execute();

if (!empty($result['node'])) {
  $nids = array_keys($result['node']);
  $nodes = node_load_multiple($nids);

  foreach ($nodes as $node) {
    // do something awesome
  }
}

Cela chargera tous les nœuds publiés de type "page". Vous devez périodiquement l'ajuster à

$query = new EntityFieldQuery();

$query->entityCondition('entity_type', 'node')
  ->entityCondition('bundle', 'page')
  ->propertyCondition('status', 1);

$result = $query->execute();

if (!empty($result['node'])) {
  $nids = array_keys($result['node']);

 foreach ($nids as $nid) {
    $node = node_load($nid, NULL, TRUE);
    // do something awesome
  }
}

pour éviter de charger trop à la fois, ce qui peut entraîner des problèmes de mémoire.

34
mpdonadio