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.

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

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

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

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

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.


Apa perbedaan jawaban Anda dengan jawaban di atas ? Persis sama.
Елин Й.
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.