¿Cómo se carga una colección de campos desde un nodo?

72

Tengo un nodo que tiene algunas colecciones de campos.

Cuando miro la node_load()salida, veo:

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

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

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

                )

        )

¿Qué función API puedo usar para cargar realmente los datos de campo contenidos en la colección que tiene un ID de entidad de 6, 7, 8, etc.?

Justin
fuente

Respuestas:

88

Doh! Debería haber buscado en el módulo de colección de campo:

entity_load('field_collection_item', array($item_id))
Justin
fuente
1
Estoy buscando una solución similar. ¿Cómo se escribe la salida y se coloca en una matriz renderizada? Gracias
cisne
Escribí un montón de funciones personalizadas para construir el diseño de estos elementos. Lamentablemente, devuelven HTML, no matrices renderizables. Sería bueno usar matrices renderizables, pero no estoy completamente claro sobre el punto (estoy seguro de que hay una buena razón para hacerlo, simplemente no he encontrado una explicación que resuene).
Justin
Gracias. La colección de campos es realmente útil para facilitar los formularios y la salida, pero cuando se trata de consultas personalizadas, parece que tengo que sumergirme en las matrices anidadas, incluso usando entity_metadata_wrapper.
cisne
Oh, sí, escribí envoltorios que solo convierten las densas matrices en lo que necesito.
Justin
entity_load () devuelve un conjunto de nodos que son específicos de "entidad" y junto con ellos obtenemos los campos definidos por el usuario también. ¿Cómo diferenciamos los campos de usuario de los campos de una entidad? ¿Alguna pista?
Raj Pawan Gumdal
38

También hay una función de contenedor que hace el mismo truco:

field_collection_item_load($id, $reset = FALSE)

o según el comentario, use:

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

para cargar varias colecciones (por ejemplo, si tiene un botón Agregar más ).

Vasiliy Grotov
fuente
55
Según la respuesta anterior de @ vasiliy-grotov, también puede usarla field_collection_item_load_multiple($ids = array(), $conditions = array(), $reset = FALSE)para cargar varias colecciones (por ejemplo, si tiene un btn "Agregar más").
mediaashley
21

field_collection_field_get_entity () debe usarse para cargar la revisión correcta.

Ejemplo de uso:

$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
fuente
1
¿Cómo obtener los campos de fecha asignados en la colección de campos? Usé lo siguiente: $ item = field_collection_field_get_entity ($ itemid); print $ item-> field_course_starts_on ['und'] [0] ['safe_value']; Pero no se imprimen valores para ello.
harikris
Gracias por esto. Me estaba volviendo constante Advertencia: array_flip (): ¡Solo puedo voltear los valores STRING e INTEGER! con ... item_load () y esto resolvió el problema.
Naidim
11

Puede usar entity_metadata_wrapperdesde el módulo Entity API :

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

También puedes recorrer todas las colecciones:

$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
fuente