Làm cách nào để tải bộ sưu tập trường từ một nút?


72

Tôi có một nút có một vài bộ sưu tập trường trên đó.

Khi tôi nhìn vào node_load()đầu ra, tôi thấy:

[field_rich_text_group] => Array
        (
            [und] => Array
                (
                    [0] => Array
                        (
                            [value] => 6
                        )

                    [1] => Array
                        (
                            [value] => 7
                        )

                    [2] => Array
                        (
                            [value] => 8
                        )

                )

        )

Tôi có thể sử dụng chức năng API nào để thực sự tải dữ liệu trường có trong bộ sưu tập có thực thể là 6, 7, 8, v.v.?

Câu trả lời:


88

Đừng! Tôi nên đã xem xét trong mô-đun bộ sưu tập trường:

entity_load('field_collection_item', array($item_id))

1
Tôi đang tìm kiếm giải pháp tương tự. Làm thế nào để bạn viết đầu ra và đặt chúng vào mảng kết xuất? Cảm ơn
thiên nga

Tôi đã viết một loạt các chức năng tùy chỉnh để xây dựng bố cục cho các mục này. Đáng buồn thay, họ trả về HTML, không phải là mảng có thể kết xuất. Sẽ thật tuyệt khi sử dụng các mảng có thể kết xuất, nhưng tôi không hoàn toàn rõ ràng về vấn đề này (tôi chắc chắn có một lý do chính đáng để làm điều đó, tôi chỉ không tìm thấy một lời giải thích nào gây được tiếng vang).
Justin

Cảm ơn. Trường colection thực sự hữu ích để giảm bớt các biểu mẫu và đầu ra, nhưng khi nói đến các truy vấn tùy chỉnh, tôi dường như phải đi sâu vào các mảng lồng nhau, thậm chí sử dụng entity_metadata_wrapper.
thiên nga

Oh yah, tôi đã viết các hàm bao chỉ biến các mảng dày đặc thành thứ tôi cần.
Justin

entity_load () trả về một tập hợp các nút dành riêng cho "thực thể" và cùng với chúng, chúng ta cũng nhận được các trường do người dùng xác định. Làm cách nào để chúng tôi phân biệt các trường người dùng với các trường của một thực thể? Bất kì manh mối nào?
Raj Pawan Gumdal

38

Ngoài ra còn có một hàm bao bọc thực hiện cùng một mẹo:

field_collection_item_load($id, $reset = FALSE)

hoặc theo nhận xét, sử dụng:

field_collection_item_load_multiple($ids = array(), $conditions = array(), $reset = FALSE)

để tải nhiều bộ sưu tập (ví dụ: nếu bạn có thêm nút khác).


5
Theo câu trả lời của @ vasiliy-grotov ở trên, bạn cũng có thể sử dụng field_collection_item_load_multiple($ids = array(), $conditions = array(), $reset = FALSE), để tải nhiều bộ sưu tập (ví dụ: nếu bạn có btn "Thêm nhiều hơn").
mediaashley

21

field_collection_field_get_entity () nên được sử dụng để tải bản sửa đổi chính xác.

Ví dụ sử dụng:

$node = node_load(1);
$items = field_get_items('node', $node, 'field_fc');
foreach ($items as $item) {
 $fc = field_collection_field_get_entity($item);
 // Do something.
}

1
Làm thế nào để có được các trường ngày được chỉ định trong bộ sưu tập trường? Tôi đã sử dụng điều sau đây. $ Item = field_collection_field_get_entity ($ itemid); in $ item-> field_cference_starts_on ['und'] [0] ['safe_value']; .Nhưng không có giá trị được in cho nó.
harikris

Cảm ơn vì điều đó. Tôi đã nhận được cảnh báo không đổi: Array_flip (): Chỉ có thể lật các giá trị STRING và INTEGER! với ... item_load () và điều này đã giải quyết vấn đề.
Naidim

11

Bạn có thể sử dụng entity_metadata_wrappertừ mô-đun Entity API :

$node_wrapper = entity_metadata_wrapper('node', $node);
$field_collection = $node_wrapper->field_rich_text_group[0]->value();
dpm($field_collection);

Bạn cũng có thể lặp tất cả các bộ sưu tập:

$node_wrapper = entity_metadata_wrapper('node', $node);
foreach ($node_wrapper->field_rich_text_group as $field_collection_wrapper) {
  $field_collection = $field_collection_wrapper->value();
  dpm($field_collection);
}
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.