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


22

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 le faire en utilisant un db_queryet en obtenant tous les ID de nœud, puis itérer dessus. Ce que j'aimerais savoir, c'est s'il y a un autre moyen de contourner cela en utilisant les fonctions drupal.

Réponses:


28

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é au $conditionstableau (deuxième argument) que vous le souhaitez, afin que le statut, créé, etc. soit également un jeu équitable.

$conditionsest 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.


3
Il a disparu dans Drupal 8, cependant.
mpdonadio

J'accepterai cette réponse car c'est exactement ce que je cherchais, mais j'utiliserai la solution @MPD car elle fonctionnera également avec Drupal 8 :)
drcelus

@drcelus Oui, la méthode MPD est certainement la meilleure voie à suivre, j'aurais probablement dû mentionner que - EntityFieldQuerytout le chemin :) Je mets cela pour plus de postérité qu'autre chose
Clive

1
entity_load_multipleexiste en D8. Cependant, vous ne pouvez pas charger par propriétés.

Merci pour la clarification. Je voulais dire que $ conditions a disparu de D8.
mpdonadio

34

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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.