Existe uma função da API Drupal para obter a lista de nós por tipo?

35

Existe uma função da API Drupal node_load()que retornará uma lista de nós por um determinado tipo?

Eu tentei $nodes = node_load(array("type" => 'student_vote')), mas ele retorna apenas um nó.

Eu sei que eu poderia codificar algo assim node_load(), mas eu queria ver se pode haver algo assim por aí.

gmercer
fonte

Respostas:

45

Dependendo da versão do 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
fonte
Sim, isso funcionaria.
Muneer
6
Lembre-se de que a matriz $ conditions é depreciada e será removida no Drupal 8. Para compatibilidade futura, seria melhor usar o EntityFieldQuery ( api.drupal.org/api/drupal/includes%21entity.inc/class/… ) para obtenha os IDs dos nós e passe-os para o primeiro argumento de node_load_multiple (). Há um bom tutorial aqui: drupal.org/node/1343708
Bala Clark
11
Apenas para maior clareza, EntityFieldQuery () não mais em Drupal 8. é
Elias Lynn
13

Não existe essa API para o Drupal 6. O mais próximo que você pode fazer é consultar corretamente todo o ID do nó para o tipo de conteúdo e carregar cada um usando node_load (), mas isso exigirá n + 1 consultas e não é muito 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_sqlgarantirá a verificação de acesso e a filtragem fornecida por outro módulo (como a filtragem de idioma fornecida pelo módulo i18n).

Para o Drupal 7, você pode usar, $nodes = node_load_multiple(array(), array('type' => $type));mas o $conditionsargumento de node_load_multiple()é preterido. Em vez disso, você deve usar EntityFieldQuery para consultar os IDs do nó e, em seguida, usar node_load_multiple()mas sem um $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
fonte
Na verdade, se você fizer um node_load () no D6 como este: node_load (array ('type' => 'page')), obterá toda uma matriz de todos os nós da página.
Blake Senftner
@bsenftner node_load (array ('type' => 'page')) retorna apenas um nó.
Chim
7

Já existem várias boas respostas, mas elas levam a pergunta literalmente e se referem apenas a nós.

Como o D6 não possui uma API para fazer o que está sendo solicitado, e não é necessário limitar-se a nós no D7 e para a frente, acho que uma boa resposta deve ser genérica para a entidade.

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
fonte
Eu adicionaria uma resposta sobre EntityFieldQuery, mas você já escreveu a sua. Eu apenas acrescentaria que o segundo argumento de user_load_multiple()foi preterido desde o Drupal 7 e o código usado deve ser o que você mostra.
Kiamlaluno
Achei que nem precisava me referir às versões antigas com argumentos descontinuados, pois acabei de usar o entity_load imediatamente. Dessa forma, não há risco de que as pessoas acidentalmente acabem usando a funcionalidade descontinuada. Ou você não concorda com isso?
Letharion
11
você quis dizer array_keys($results[$entity_type])?
commonpike 5/02/15
@ commonpike Provavelmente sim. Não tenho a oportunidade de verificar no momento, mas fique à vontade para editar e corrigir se você testá-lo. :)
Letharion
Eu estava fazendo algo um pouco diferente e precisava especificar entity_load($entity_type, array_keys($results['node']));. Havent testou-o para outras entidades ..
commonpike 07/02
1

drupal 8:

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

Obter a lista de nós de um tipo de conteúdo

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 isso seja útil.

Nitesh Sethia
fonte
O que é diferente na sua resposta do que o resposta acima ? É exatamente a mesma coisa.
Елин Й.