Есть ли функция Drupal API для получения списка узлов по типу?

35

Есть ли такая функция Drupal API, node_load()которая будет возвращать список узлов данного типа?

Я пытался $nodes = node_load(array("type" => 'student_vote')), но он возвращает только один узел.

Я знаю, что могу написать что-то подобное node_load(), но я хотел посмотреть, может ли быть что-то подобное уже там.

gmercer
источник

Ответы:

45

В зависимости от версии Drupal:

друпал 6:

$nodes = db_query('SELECT nid FROM {node} WHERE type="%s"', $type);

друпал 7:

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

друпал 8:

$nids = \Drupal::entityQuery('node')
  ->condition('type', 'NODETYPE')
  ->execute();
$nodes = \Drupal::entityTypeManager()
  ->getStorage('node')
  ->loadMultiple($nids);
Никит
источник
Да, это будет работать.
Muneer
6
Имейте в виду, что массив $ condition устарел и будет удален в Drupal 8, для будущей совместимости было бы лучше использовать EntityFieldQuery ( api.drupal.org/api/drupal/includes%21entity.inc/class/… ) для получить идентификаторы узла, затем передать их в первый аргумент node_load_multiple (). Здесь есть хорошее руководство: drupal.org/node/1343708
Бала Кларк,
1
Просто для ясности, EntityFieldQuery () больше нет в Drupal 8.
Элайджа Линн
13

Для Drupal 6 такого API не существует. Самое близкое, что вы можете сделать, это правильно запросить все ID узла для типа контента, а затем загрузить каждый с помощью 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 (array ('type' => 'page')) возвращает только один узел.
Чим
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[$]));
}
Letharion
источник
Я собирался добавить ответ о EntityFieldQuery, но вы уже написали свой. Я бы просто добавил, что второй аргумент user_load_multiple()не рекомендуется с Drupal 7, и используемый код должен быть тем, который вы показываете.
kiamlaluno
Я решил, что мне даже не нужно ссылаться на старые версии с устаревшими аргументами, так как я просто сразу использовал entity_load. Таким образом, нет никакого риска того, что люди случайно закончат использовать устаревшую функциональность. Или ты с этим не согласен?
Летарион
1
ты имел ввиду array_keys($results[$entity_type])?
commonpike
@commonpike Скорее всего, да. У меня нет возможности проверить в данный момент, но не стесняйтесь редактировать и исправлять, если вы проверяете это. :)
Летарион
Я делал что-то немного другое, и мне нужно было уточнить entity_load($entity_type, array_keys($results['node']));. Не проверял это для других лиц ..
commonpike
1

друпал 8:

$nids = \Drupal::entityQuery('node')
  ->condition('type', 'student_vote')
  ->execute();
$nodes = \Drupal::entityTypeManager()
  ->getStorage('node')
  ->loadMultiple($nids);
Andrea
источник
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);

Надеюсь, что это будет полезно.

Нитеш Сетия
источник
Чем отличается ваш ответ от приведенного выше ответа ? Это точно так же.
Елин Й.