Czy istnieje funkcja API Drupal, aby uzyskać listę węzłów według typu?

35

Czy istnieje taka funkcja Drupal API node_load(), która zwróci listę węzłów danego typu?

Próbowałem $nodes = node_load(array("type" => 'student_vote')), ale zwraca tylko jeden węzeł.

Wiem, że mógłbym napisać coś takiego node_load(), ale chciałem sprawdzić, czy coś takiego już tam jest.

Gmercer
źródło

Odpowiedzi:

45

W zależności od wersji 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
źródło
Tak, to by zadziałało.
Muneer
6
Należy pamiętać, że tablica $ warunki jest przestarzała i zostanie usunięta w Drupal 8, dla przyszłej kompatybilności lepiej byłoby użyć EntityFieldQuery ( api.drupal.org/api/drupal/include%21entity.inc/class/... ), aby pobierz identyfikatory węzłów, a następnie przekaż je do pierwszego argumentu node_load_multiple (). Jest tu dobry tutorial: drupal.org/node/1343708
Bala Clark
1
Dla jasności EntityFieldQuery () nie jest już dostępny w Drupal 8.
Elijah Lynn
13

Nie ma takiego interfejsu API dla Drupala 6. Najbliższe, co możesz zrobić, to poprawnie zapytać o wszystkie identyfikatory węzłów dla typu zawartości, a następnie załadować każdy za pomocą node_load (), ale będzie to wymagało n + 1 zapytań i nie jest bardzo wydajne.

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

Uwaga: db_rewrite_sqlzapewni sprawdzenie dostępu i inne filtry zapewniane przez moduł (takie jak filtrowanie języka zapewniane przez moduł i18n).

W przypadku Drupala 7 możesz użyć, $nodes = node_load_multiple(array(), array('type' => $type));ale $conditionsargument parametru node_load_multiple()jest przestarzały. Zamiast tego należy użyć EntityFieldQuery do zapytania o identyfikatory węzła, a następnie użyć, node_load_multiple()ale bez $conditionargumentu 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
źródło
W rzeczywistości, jeśli wykonasz funkcję node_load () w D6 w następujący sposób: node_load (array ('type' => 'page')), otrzymasz całą tablicę wszystkich węzłów strony.
Blake Senftner
@bsenftner node_load (tablica („typ” => „strona”)) zwraca tylko jeden węzeł.
chim
7

Jest już kilka dobrych odpowiedzi, ale biorą pytanie dosłownie i odnoszą się tylko do węzłów.

Ponieważ D6 nie ma interfejsu API do robienia tego, o co jest poproszony, i nie jest konieczne ograniczanie się do węzłów w D7 i do przodu, uważam, że dobra odpowiedź powinna być ogólna.

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
źródło
Chciałem dodać odpowiedź EntityFieldQuery, ale ty już napisałeś swoją. Dodałbym tylko, że drugi argument user_load_multiple()był przestarzały od Drupala 7, a użyty kod powinien być tym, który wyświetlasz.
kiamlaluno
Uznałem, że nawet nie muszę odwoływać się do starych wersji ze zdezaktualizowanymi argumentami, ponieważ od razu użyłem obiektu entity_load. W ten sposób nie ma „ryzyka”, że ludzie przypadkowo skorzystają z przestarzałej funkcjonalności. A może się z tym nie zgadzasz?
Letharion
1
miałeś na myśli array_keys($results[$entity_type])?
commonpike
@commonpike Najprawdopodobniej tak. W tej chwili nie mam możliwości sprawdzenia, ale możesz go edytować i poprawiać, jeśli go przetestujesz. :)
Letharion
Robiłem coś nieco innego i musiałem to sprecyzować entity_load($entity_type, array_keys($results['node']));. Havent przetestował to dla innych podmiotów.
commonpike
1

drupal 8:

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

Pobierz listę węzłów z typu zawartości

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

Mam nadzieję, że byłoby to pomocne.

Nitesh Sethia
źródło
Czym różni się twoja odpowiedź od powyższej ? Jest dokładnie tak samo.
Елин Й.