Esiste una funzione API Drupal per ottenere l'elenco dei nodi per tipo?


35

Esiste una funzione API Drupal come node_load()quella che restituirà un elenco di nodi per un determinato tipo?

Ho provato $nodes = node_load(array("type" => 'student_vote')), ma restituisce solo un nodo.

So che potrei codificare qualcosa del genere node_load(), ma volevo vedere se potrebbe esserci già qualcosa del genere.

Risposte:


45

A seconda della versione di 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ì, questo avrebbe funzionato.
Muneer,

6
Ricorda che l'array $ condition è deprezzato e verrà rimosso in Drupal 8, per compatibilità futura sarebbe meglio usare EntityFieldQuery ( api.drupal.org/api/drupal/includes%21entity.inc/class/… ) per ottenere gli ID nodo, quindi passarli nel primo argomento di node_load_multiple (). C'è un buon tutorial qui: drupal.org/node/1343708
Bala Clark,

1
Solo per chiarezza, EntityFieldQuery () non è più in Drupal 8.
Elijah Lynn

13

Non esiste un'API di questo tipo per Drupal 6. Il più vicino che puoi fare è eseguire una query corretta per tutti gli ID nodo per il tipo di contenuto, quindi caricarli ciascuno utilizzando node_load () ma ciò richiederà n + 1 query e non è molto efficiente.

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_sqlassicurerà il controllo dell'accesso e altri filtri forniti dal modulo (come il filtro della lingua fornito dal modulo i18n).

Per Drupal 7, puoi usare $nodes = node_load_multiple(array(), array('type' => $type));ma l' $conditionsargomento di node_load_multiple()è deprecato. Invece, è necessario utilizzare EntityFieldQuery per eseguire una query per gli ID nodo quindi utilizzare node_load_multiple()ma senza un $conditionargomento 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']));
}

In realtà, se si esegue un node_load () in D6 in questo modo: node_load (array ('type' => 'page')) si otterrà tutto un array di tutti i nodi di pagina.
Blake Senftner,

@bsenftner node_load (array ('type' => 'page')) restituisce solo un nodo.
Chim

7

Esistono già diverse risposte valide, ma prendono la domanda alla lettera e fanno riferimento solo ai nodi.

Dal momento che D6 non ha un'API per fare ciò che viene richiesto e non è necessario limitarsi ai nodi in D7 e inoltro, ritengo che una buona risposta dovrebbe essere un'entità generica.

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

Stavo per aggiungere una risposta EntityFieldQuery, ma hai già scritto la tua. Vorrei solo aggiungere che il secondo argomento di user_load_multiple()è stato deprecato da Drupal 7 e che il codice usato dovrebbe essere quello che mostri.
kiamlaluno

Ho pensato che non avevo nemmeno bisogno di fare riferimento alle vecchie versioni con argomenti deprecati poiché ho usato subito entity_load. In questo modo non c'è "nessun" rischio che le persone finiscano accidentalmente usando la funzionalità deprecata. O non sei d'accordo con quello?
Letharion,

1
intendevi array_keys($results[$entity_type])?
commonpike,

@commonpike Molto probabilmente, sì. Non ho l'opportunità di verificare al momento, ma sentiti libero di modificare e correggere se lo provi. :)
Letharion,

Stavo facendo qualcosa di leggermente diverso e avevo bisogno di specificare entity_load($entity_type, array_keys($results['node']));. Non l'ho provato per altre entità ..
commonpike,

1

drupal 8:

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

1

Ottieni l'elenco di nodi da un tipo di contenuto

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

Spero che questo sia utile.


Cosa c'è di diverso nella tua risposta rispetto alla risposta sopra ? È esattamente lo stesso
Елин Й.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.