Vorgehensweise zum Durchlaufen aller Knoten eines Inhaltstyps

22

Ich möchte einige Informationen aus einem Feld aller Knoten eines bestimmten Inhaltstyps wiederherstellen. Ich weiß, wie man es macht, indem man eine verwendet db_queryund die gesamte Knoten-ID abruft und sie dann durchläuft. Ich würde gerne wissen, ob es einen anderen Weg gibt, Drupal-Funktionen zu verwenden.

drcelus
quelle

Antworten:

28

Sie können diese Informationen direkt über abfragen node_load_multiple()

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

Sie können dem $conditionsArray beliebig viele Eigenschaftsbedingungen hinzufügen (zweites Argument), sodass Status, Erstellt usw. auch für faires Spiel gelten.

$conditionsist technisch veraltet (ich stelle es mir vor EntityFieldQuery), aber die Wahrscheinlichkeit, dass diese Funktionalität jemals von Drupal 7 entfernt wird, ist im Grunde genommen gleich Null. Es würde zu viel brechen.

Clive
quelle
3
Es ist jedoch in Drupal 8 weg.
mpdonadio
Ich werde diese Antwort akzeptieren, da sie genau das ist, wonach ich gesucht habe, aber ich werde die @MPD-Lösung verwenden, da sie auch mit Drupal 8
funktioniert
@drcelus Ja, MPDs Methode ist definitiv der beste Weg, ich hätte das wahrscheinlich erwähnen sollen - den EntityFieldQueryganzen Weg :) Ich sage, dies ist mehr für die Nachwelt als alles andere
Clive
1
entity_load_multipleexistiert in D8. Sie können jedoch nicht nach Eigenschaften laden.
Danke für die Klarstellung. Ich habe gemeint, dass $ Bedingungen von D8 verschwunden ist.
mpdonadio
34

Drupal Core bietet eine Klasse namens EntityFieldQuery(). Es gibt auch eine praktische Dokumentenseite , die viele Beispiele enthält. In seiner einfachsten Form:

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

Dadurch werden alle veröffentlichten Knoten vom Typ "Seite" geladen. Sie müssen dies in regelmäßigen Abständen anpassen

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

um zu vermeiden, dass zu viel auf einmal geladen wird, was zu Speicherproblemen führen kann.

mpdonadio
quelle