Apakah ada fungsi Drupal API untuk mendapatkan daftar node berdasarkan jenis?

35

Apakah ada fungsi Drupal API seperti node_load()itu akan mengembalikan daftar node berdasarkan jenis yang diberikan?

Saya sudah mencoba $nodes = node_load(array("type" => 'student_vote')), tetapi hanya mengembalikan satu node.

Saya tahu saya bisa membuat kode seperti itu node_load(), tetapi saya ingin melihat apakah mungkin sudah ada yang seperti itu di luar sana.

penjual sayur
sumber

Jawaban:

45

Bergantung pada versi 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
sumber
Ya, ini akan berhasil.
Muneer
6
Ingatlah bahwa array $ conditions didepresiasi dan akan dihapus di Drupal 8, untuk kompatibilitas di masa mendatang akan lebih baik menggunakan EntityFieldQuery ( api.drupal.org/api/drupal/includes%21entity.inc/class/… ) untuk dapatkan id simpul, lalu meneruskannya ke argumen pertama node_load_multiple (). Ada tutorial yang bagus di sini: drupal.org/node/1343708
Bala Clark
1
Hanya untuk kejelasan, EntityFieldQuery () tidak ada lagi di Drupal 8.
Elijah Lynn
13

Tidak ada API untuk Drupal 6. Yang paling dekat yang dapat Anda lakukan adalah dengan benar meminta semua ID node untuk jenis konten kemudian memuat masing-masing menggunakan node_load () tetapi ini akan membutuhkan n +1 query dan tidak sangat efisien.

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

Catatan: db_rewrite_sqlakan memastikan pemeriksaan akses dan pemfilteran yang disediakan modul lainnya (seperti pemfilteran bahasa yang disediakan oleh modul i18n).

Untuk Drupal 7, Anda dapat menggunakan $nodes = node_load_multiple(array(), array('type' => $type));tetapi $conditionsargumen node_load_multiple()sudah tidak digunakan lagi. Sebagai gantinya, Anda harus menggunakan EntityFieldQuery untuk meminta ID node lalu gunakan node_load_multiple()tetapi tanpa $conditionargumen.

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
sumber
Sebenarnya, jika Anda melakukan node_load () di D6 seperti ini: node_load (array ('type' => 'page')) Anda akan mendapatkan semua array dari semua node halaman.
Blake Senftner
@bsenftner node_load (array ('type' => 'page')) hanya mengembalikan satu node.
chim
7

Sudah ada beberapa jawaban bagus, tetapi mereka menjawab pertanyaan itu secara harfiah dan hanya merujuk pada simpul.

Karena D6 tidak memiliki API untuk melakukan apa yang diminta, dan tidak perlu membatasi diri ke node di D7 dan meneruskan, saya merasa jawaban yang baik harus entitas generik.

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
sumber
Saya akan menambahkan jawaban EntityFieldQuery, tetapi Anda sudah menulis jawaban Anda. Saya hanya akan menambahkan bahwa argumen kedua user_load_multiple()telah ditinggalkan sejak Drupal 7, dan kode yang digunakan harus yang Anda tunjukkan.
kiamlaluno
Saya pikir saya bahkan tidak perlu merujuk ke versi lama dengan argumen yang sudah usang karena saya baru saja menggunakan entity_load. Dengan begitu ada "tidak" risiko orang-orang secara tidak sengaja berakhir menggunakan fungsi yang sudah tidak digunakan lagi. Atau apakah Anda tidak setuju dengan itu?
Letharion
1
yang Anda maksud array_keys($results[$entity_type])?
commonpike
@commonpike Kemungkinan besar, ya. Saya tidak memiliki kesempatan untuk memeriksa saat ini, tetapi merasa bebas untuk mengedit dan memperbaiki jika Anda mengujinya. :)
Letharion
Saya melakukan sesuatu yang sedikit berbeda dan perlu ditentukan entity_load($entity_type, array_keys($results['node']));. Havent mengujinya untuk entitas lain ..
commonpike
1

drupal 8:

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

Dapatkan daftar node dari tipe konten

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

Semoga ini bisa membantu.

Nitesh Sethia
sumber
Apa perbedaan jawaban Anda dengan jawaban di atas ? Persis sama.
Елин Й.