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.