¿Existe una función API de Drupal para obtener la lista de nodos por tipo?

35

¿Existe una función API de Drupal como node_load()esa que devolverá una lista de nodos por un tipo dado?

Lo intenté $nodes = node_load(array("type" => 'student_vote')), pero solo devuelve un nodo.

Sé que podría codificar algo así node_load(), pero quería ver si ya podría haber algo así.

gmercer
fuente

Respuestas:

45

Dependiendo de la versión de 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
fuente
Sí, esto funcionaría.
Muneer
66
Tenga en cuenta que el conjunto de condiciones $ se deprecia y se eliminará en Drupal 8, para una compatibilidad futura sería mejor usar EntityFieldQuery ( api.drupal.org/api/drupal/includes%21entity.inc/class/… ) para obtener los identificadores de nodo, luego pasarlos al primer argumento de node_load_multiple (). Aquí hay un buen tutorial: drupal.org/node/1343708
Bala Clark
1
Solo por claridad, EntityFieldQuery () ya no está en Drupal 8.
Elijah Lynn
13

No existe tal API para Drupal 6. Lo más cercano que puede hacer es consultar adecuadamente todas las ID de nodo para el tipo de contenido y luego cargar cada una usando node_load (), pero esto requerirá n + 1 consultas y no es muy eficiente.

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

Nota: db_rewrite_sqlgarantizará la verificación de acceso y otros filtros proporcionados por el módulo (como el filtrado de idioma proporcionado por el módulo i18n).

Para Drupal 7, puede usar $nodes = node_load_multiple(array(), array('type' => $type));pero el $conditionsargumento de node_load_multiple()está en desuso. En su lugar, debe usar EntityFieldQuery para consultar las ID de nodo y luego usar node_load_multiple()pero sin un $conditionargumento 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
fuente
En realidad, si haces un node_load () en D6 como este: node_load (array ('type' => 'page')) obtendrás toda una matriz de todos los nodos de página.
Blake Senftner
@bsenftner node_load (array ('type' => 'page')) solo devuelve un nodo.
chim
7

Ya hay varias buenas respuestas, pero toman la pregunta literalmente y se refieren solo a los nodos.

Dado que D6 no tiene una API para hacer lo que se le pide, y no es necesario limitarse a nodos en D7 y reenviar, creo que una buena respuesta debería ser entidad genérica.

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
fuente
Iba a agregar una respuesta sobre EntityFieldQuery, pero ya has escrito la tuya. Solo agregaría que el segundo argumento de user_load_multiple()ha quedado en desuso desde Drupal 7, y el código utilizado debería ser el que muestre.
kiamlaluno
Pensé que ni siquiera necesitaba referirme a las versiones antiguas con argumentos obsoletos, ya que solo usé entity_load de inmediato. De esa manera, no hay riesgo de que las personas terminen accidentalmente usando la funcionalidad obsoleta. ¿O no estás de acuerdo con eso?
Letharion
1
quisiste decir array_keys($results[$entity_type])?
commonpike
@commonpike Lo más probable es que sí. No tengo la oportunidad de verificar en este momento, pero siéntase libre de editar y corregir si lo prueba. :)
Letharion
Estaba haciendo algo ligeramente diferente y necesitaba especificar entity_load($entity_type, array_keys($results['node']));. Havent lo probó para otras entidades ...
commonpike
1

drupal 8:

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

Obtenga la lista de nodos de un tipo de contenido

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

Espero que esto sea útil.

Nitesh Sethia
fuente
¿Qué es diferente en su respuesta que la respuesta anterior ? Es exactamente lo mismo.
Елин Й.