¿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í.

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

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

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

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

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.


¿Qué es diferente en su respuesta que la respuesta anterior ? Es exactamente lo mismo.
— Елин Й.
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.