it-swarm-vi.com

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

Có một hàm Drupal API như node_load() sẽ trả về 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 thứ gì đó như 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.

37
gmercer

Tùy thuộc vào phiên bản Drupal:

drupal 6 :

$nodes = db_query('SELECT nid FROM {node} WHERE type="%s"', $type);

ngày 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);
47
Nikit

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 n + 1 truy vấn 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_sql sẽ đảm bảo kiểm tra truy cập và mô-đun khác được cung cấp tính năng lọc (chẳng hạn như lọc ngôn ngữ được cung cấp bởi mô-đun i18n).

Với Drupal 7, bạn có thể sử dụng $nodes = node_load_multiple(array(), array('type' => $type)); nhưng đối số $conditions Của 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ó đối số $condition.

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

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

Lấy danh sách các nút 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.

1
Nitesh Sethia

ngày 8 tháng 8

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