Jak załadować kolekcję pól z węzła?

72

Mam węzeł, który ma kilka zbiorów w terenie.

Kiedy patrzę na node_load()wynik, widzę:

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

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

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

                )

        )

Jakiej funkcji API mogę użyć do faktycznego załadowania danych pól zawartych w kolekcji, która ma identyfikator podmiotu równy 6, 7, 8 itd.?

Justin
źródło

Odpowiedzi:

88

Doh! Powinienem był zajrzeć do modułu kolekcji pól:

entity_load('field_collection_item', array($item_id))
Justin
źródło
1
Szukam podobnego rozwiązania. Jak napisać dane wyjściowe i umieścić je w renderowanej tablicy? Dzięki
łabędź,
Napisałem wiele niestandardowych funkcji, aby zbudować układ tych elementów. Niestety zwracają HTML, a nie tablice do renderowania. Byłoby miło użyć tablic do renderowania, ale nie jestem do końca jasny w tej kwestii (jestem pewien, że istnieje dobry powód, aby to zrobić, po prostu nie znalazłem wyjaśnienia, które rezonuje).
Justin
Dzięki. Kolekcjonowanie pól jest rzeczywiście przydatne w celu ułatwienia formularzy i danych wyjściowych, ale jeśli chodzi o zapytania niestandardowe, wydaje mi się, że muszę zagłębiać się w zagnieżdżone tablice, nawet używając encji_metadanych_wrapper.
łabędź
O tak, napisałem opakowania, które po prostu zamieniają gęste tablice w to, czego potrzebuję.
Justin,
entity_load () zwraca zestaw węzłów, które są specyficzne dla „bytu”, a wraz z nimi otrzymujemy również pola zdefiniowane przez użytkownika. Jak odróżnić pola użytkowników od pól encji? Jakieś wskazówki?
Raj Pawan Gumdal,
38

Istnieje również funkcja otoki, która wykonuje tę samą sztuczkę:

field_collection_item_load($id, $reset = FALSE)

lub zgodnie z komentarzem użyj:

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

aby załadować wiele kolekcji (na przykład, jeśli masz przycisk Dodaj więcej ).

Wasilij Grotow
źródło
5
Zgodnie z powyższą odpowiedzią @ vasiliy-grotov możesz także użyć field_collection_item_load_multiple($ids = array(), $conditions = array(), $reset = FALSE)do załadowania wielu kolekcji (na przykład, jeśli masz opcję „Dodaj więcej”).
mediaashley
21

należy użyć field_collection_field_get_entity () , aby załadować poprawną wersję.

Przykładowe użycie:

$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.
}
jonhattan
źródło
1
jak uzyskać przypisane pola daty w zbiorze pól? Użyłem następującej rzeczy: $ item = field_collection_field_get_entity ($ itemid); wydrukuj $ item-> field_course_starts_on ['und'] [0] ['safe_value']; Ale żadne wartości nie są dla niego drukowane.
harikris,
Dzięki za to. Otrzymywałem ciągłe Ostrzeżenie: array_flip (): Może odwracać tylko wartości STRING i INTEGER! z ... item_load () i to rozwiązało problem.
Naidim
11

Możesz użyć entity_metadata_wrapperz modułu Entity API :

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

Możesz również zapętlić wszystkie kolekcje:

$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);
}
Milkovsky
źródło