Cách lặp lại tất cả các nút từ một loại nội dung


22

Tôi muốn khôi phục một số thông tin từ một trường của tất cả các nút của một loại nội dung cụ thể. Tôi biết làm thế nào để làm điều đó bằng cách sử dụng a db_queryvà nhận tất cả ID nút sau đó lặp lại chúng. Những gì tôi muốn biết là nếu có một cách khác xung quanh điều này bằng cách sử dụng các chức năng drupal.

Câu trả lời:


28

Bạn có thể truy vấn thông tin đó trực tiếp thông qua node_load_multiple()

$nodes = node_load_multiple(array(), array('type' => 'my_type'));

Bạn có thể thêm bao nhiêu điều kiện thuộc tính vào $conditionsmảng (đối số thứ hai) tùy thích, vì vậy trạng thái, được tạo, v.v cũng là trò chơi công bằng.

$conditionsbị phản đối về mặt kỹ thuật (tôi tưởng tượng có lợi EntityFieldQuery) nhưng cơ hội chức năng đó đã bị xóa khỏi Drupal 7 về cơ bản là không có. Nó sẽ phá vỡ quá nhiều.


3
Nó đã biến mất trong Drupal 8, mặc dù.
mpdon Arena

Tôi sẽ chấp nhận câu trả lời này vì đó chính xác là những gì tôi đang tìm kiếm, nhưng sẽ sử dụng giải pháp @MPD vì nó cũng sẽ hoạt động với Drupal 8 :)
drcelus

@drcelus Có, phương pháp của MPD chắc chắn là cách tốt nhất để đi, tôi có lẽ nên đề cập đến điều đó - bằng EntityFieldQuerymọi cách :) Tôi đặt điều này cho hậu thế nhiều hơn bất cứ điều gì khác
Clive

1
entity_load_multipletồn tại trong D8. Bạn không thể tải theo tài sản mặc dù.

Cảm ơn bạn đã làm rõ. Tôi đã có nghĩa là điều kiện $ đã đi từ D8.
mpdon Arena

34

Lõi Drupal cung cấp một lớp gọi là EntityFieldQuery(). Ngoài ra còn có một trang tài liệu tiện dụng để sử dụng nó, có rất nhiều ví dụ. Ở dạng đơn giản nhất:

$query = new EntityFieldQuery();

$query->entityCondition('entity_type', 'node')
  ->entityCondition('bundle', 'page')
  ->propertyCondition('status', 1);

$result = $query->execute();

if (!empty($result['node'])) {
  $nids = array_keys($result['node']);
  $nodes = node_load_multiple($nids);

  foreach ($nodes as $node) {
    // do something awesome
  }
}

Điều này sẽ tải tất cả các nút được xuất bản của loại "trang". Bạn định kỳ cần điều chỉnh điều này để

$query = new EntityFieldQuery();

$query->entityCondition('entity_type', 'node')
  ->entityCondition('bundle', 'page')
  ->propertyCondition('status', 1);

$result = $query->execute();

if (!empty($result['node'])) {
  $nids = array_keys($result['node']);

 foreach ($nids as $nid) {
    $node = node_load($nid, NULL, TRUE);
    // do something awesome
  }
}

để tránh tải quá nhiều cùng một lúc, điều này có thể gây ra vấn đề bộ nhớ.

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.