Чи є функція Drupal API для отримання списку вузлів за типом?


35

Чи існує така функція Drupal API, node_load()яка повертає список вузлів заданого типу?

Я спробував $nodes = node_load(array("type" => 'student_vote')), але він повертає лише один вузол.

Я знаю, що міг би зашифрувати щось на кшталт node_load(), але я хотів дізнатися, чи може там щось подібне вже є.

Відповіді:


45

Залежно від версії 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);

Так, це спрацювало б.
Muneer

6
Майте на увазі, що масив $ умов знецінюється і буде видалений у Drupal 8, для подальшої сумісності було б краще використовувати EntityFieldQuery ( api.drupal.org/api/drupal/includes%21entity.inc/class/… ) для отримати ідентифікатори вузла, а потім передати їх у перший аргумент node_load_multiple (). Тут є хороший підручник: drupal.org/node/1343708
Бала Кларк

1
Тільки для ясності, EntityFieldQuery () більше не в Drupal 8.
Ілля Лінн

13

Немає такого API для Drupal 6. Найближчим тобою є правильний запит для всіх ідентифікаторів вузла для типу вмісту, а потім завантаження кожного за допомогою node_load (), але для цього знадобиться n + 1 запитів і не дуже ефективно.

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

Примітка: db_rewrite_sqlзабезпечить перевірку доступу та фільтрацію, що надається іншим модулем (наприклад, фільтрування мови, що надається модулем i18n).

Для Drupal 7 ви можете використовувати, $nodes = node_load_multiple(array(), array('type' => $type));але $conditionsаргумент node_load_multiple()застарілий. Натомість слід використовувати EntityFieldQuery для запиту ідентифікаторів вузла, а потім використовувати, node_load_multiple()але без $conditionаргументу 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']));
}

Насправді, якщо ви зробите node_load () в D6 таким чином: node_load (array ('type' => 'page')), ви отримаєте весь масив усіх вузлів сторінки.
Блейк Сенфтнер

@bsenftner node_load (масив ('type' => 'сторінка')) повертає лише один вузол.
шим

7

Уже є кілька хороших відповідей, але вони розуміють питання буквально і посилаються лише на вузли.

Оскільки D6 не має API для виконання того, що просять, і не потрібно обмежувати себе вузлами в D7 і вперед, я вважаю, що хороша відповідь повинна бути загальною для сутності.

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[$]));
}

Я збирався додати відповідь про EntityFieldQuery, але ви вже написали своє. Я просто додам, що другий аргумент user_load_multiple()застарілий після Drupal 7, і використаний код повинен бути тим, який ви показуєте.
kiamlaluno

Я подумав, що мені навіть не потрібно посилатися на старі версії із застарілими аргументами, оскільки я просто використовував entit_load відразу. Таким чином, немає "ніякого" ризику, коли люди випадково покінчать із застарілою функціональністю. Або ви не згодні з цим?
Летаріон

1
ти мав на увазі array_keys($results[$entity_type])?
commonpike

@commonpike Швидше за все, так. На даний момент у мене немає можливості перевірити, але сміливо редагуйте та виправляйте, якщо ви перевірите це. :)
Летаріон

Я робив щось трохи інше і потрібно було уточнити entity_load($entity_type, array_keys($results['node']));. Хавент перевірив його для інших організацій ..
звичайний спік

1

drupal 8:

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

1

Отримайте список вузлів типу вмісту

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

Сподіваюся, що це буде корисно.


Що у вашій відповіді відрізняється від наведеної вище ? Це точно так само.
Елін Й.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.