Có chức năng API Drupal để lấy danh sách các nút theo loại không?


35

Có một hàm API Drupal như thế node_load()sẽ trả về một danh sách các nút theo một loại nhất định không?

Tôi đã thử $nodes = node_load(array("type" => 'student_vote')), nhưng nó chỉ trả về một nút.

Tôi biết tôi có thể mã hóa một cái gì đó như thế node_load(), nhưng tôi muốn xem liệu có thể có bất cứ thứ gì như thế ngoài đó không.

Câu trả lời:


45

Tùy thuộc vào phiên bản của 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);

Vâng, điều này sẽ làm việc.
Muneer

6
Hãy nhớ rằng mảng $ condition bị khấu hao và sẽ bị xóa trong Drupal 8, để tương thích trong tương lai, tốt hơn là sử dụng EntityFieldQuery ( api.drupal.org/api/drupal/includes%21entity.inc/ class / tựa ) để lấy id của nút, sau đó chuyển chúng vào đối số đầu tiên của node_load_mult Môn (). Có một hướng dẫn tốt ở đây: drupal.org/node/1343708
Bala Clark

1
Nói rõ hơn, EntityFieldQuery () không còn nữa trong Drupal 8.
Elijah Lynn

13

Không có API như vậy cho Drupal 6. Cách gần nhất bạn có thể làm là truy vấn chính xác tất cả ID nút cho loại nội dung sau đó tải từng cái bằng cách sử dụng node_load () nhưng điều này sẽ yêu cầu truy vấn n + 1 và không hiệu quả lắm.

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

Lưu ý: db_rewrite_sqlsẽ đảm bảo kiểm tra truy cập và mô-đun khác được cung cấp lọc (chẳng hạn như lọc ngôn ngữ được cung cấp bởi mô-đun i18n).

Đối với Drupal 7, bạn có thể sử dụng $nodes = node_load_multiple(array(), array('type' => $type));nhưng $conditionsđối số node_load_multiple()bị phản đối. Thay vào đó, bạn nên sử dụng EntityFieldQuery để truy vấn ID nút sau đó sử dụng node_load_multiple()nhưng không có $conditionđối số 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']));
}

Trên thực tế, nếu bạn thực hiện một node_load () trong D6 như thế này: node_load (mảng ('type' => 'page')), bạn sẽ nhận được tất cả một mảng của tất cả các nút trang.
Blake Senftner

@bsenftner node_load (mảng ('type' => 'page')) chỉ trả về một nút.
chim

7

Đã có một số câu trả lời hay, nhưng họ đưa ra câu hỏi theo nghĩa đen và chỉ tham khảo các nút.

Vì D6 không có API để thực hiện những gì đang được yêu cầu và không cần thiết phải giới hạn bản thân ở các nút trong D7 và chuyển tiếp, tôi cảm thấy một câu trả lời tốt nên là chung chung thực thể.

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

Tôi sẽ thêm một câu trả lời EntityFieldQuery, nhưng bạn đã viết của bạn. Tôi chỉ muốn nói thêm rằng đối số thứ hai user_load_multiple()đã bị phản đối kể từ Drupal 7 và mã được sử dụng phải là mã bạn hiển thị.
kiamlaluno

Tôi hình dung tôi thậm chí không cần tham khảo các phiên bản cũ với các đối số không được chấp nhận vì tôi chỉ sử dụng entity_load ngay lập tức. Theo cách đó, có nguy cơ "không" người vô tình kết thúc bằng cách sử dụng chức năng không dùng nữa. Hay bạn không đồng ý với điều đó?
Letharion

1
ý bạn là array_keys($results[$entity_type])sao
thường

@commonpike Rất có thể, vâng. Tôi không có cơ hội kiểm tra vào lúc này, nhưng hãy thoải mái chỉnh sửa và sửa nếu bạn kiểm tra. :)
Letharion 7/2/2015

Tôi đã làm một cái gì đó hơi khác nhau và cần thiết để xác định entity_load($entity_type, array_keys($results['node']));. Havent đã thử nghiệm nó cho các thực thể khác ..
Commonpike 7/215

1

drupal 8:

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

1

Lấy danh sách các nút từ một loại nội dung

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

Hy vọng rằng điều này sẽ hữu ích.


Câu trả lời của bạn có gì khác so với câu trả lời trên ? Nó là chính xác như nhau.
ЕЕннн
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.