Como carrego uma coleção de campos de um nó?

72

Eu tenho um nó que possui algumas coleções de campos.

Quando olho para a node_load()saída, vejo:

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

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

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

                )

        )

Qual função de API posso usar para realmente carregar os dados do campo contidos na coleção que possui um entity_id de 6, 7, 8 etc.?

Justin
fonte

Respostas:

88

Doh! Eu deveria ter olhado no módulo de coleta de campo:

entity_load('field_collection_item', array($item_id))
Justin
fonte
11
Estou procurando uma solução semelhante. Como você escreve a saída e as colocou na matriz renderizada? Obrigado
cisne
Escrevi várias funções personalizadas para criar o layout desses itens. Infelizmente, eles retornam matrizes HTML, não renderizáveis. Seria bom usar matrizes renderizáveis, mas não estou completamente claro (tenho certeza de que há uma boa razão para fazê-lo, apenas não encontrei uma explicação que ressoe).
11117 Justin
Obrigado. A coleção de campos é realmente útil para facilitar os formulários e a saída, mas quando se trata de consultas personalizadas, pareço ter que mergulhar nas matrizes aninhadas, mesmo usando entity_metadata_wrapper.
swan
Ah, sim, escrevi invólucros que transformam as matrizes densas no que eu preciso.
11117 Justin
entity_load () retorna um conjunto de nós que são específicos para "entity" e, junto com eles, também obtemos os campos definidos pelo usuário. Como diferenciamos os campos do usuário dos campos de uma entidade? Alguma pista?
Raj Pawan Gumdal,
38

Há também uma função de wrapper que faz o mesmo truque:

field_collection_item_load($id, $reset = FALSE)

ou conforme comentário, use:

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

para carregar várias coleções (por exemplo, se você tiver um botão Adicionar mais ).

Vasiliy Grotov
fonte
5
Conforme a resposta de @ vasiliy-grotov acima, você também pode usar field_collection_item_load_multiple($ids = array(), $conditions = array(), $reset = FALSE)para carregar várias coleções (por exemplo, se você tiver um btn "Adicionar mais").
mediaashley
21

field_collection_field_get_entity () deve ser usado para carregar a revisão correta.

Exemplo 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
fonte
11
como obter os campos de data atribuídos na coleção de campos? Eu usei o seguinte: $ item = field_collection_field_get_entity ($ itemid); imprime $ item-> field_course_starts_on ['und'] [0] ['safe_value']; .Mas nenhum valor está sendo impresso para ele.
harikris
Obrigado por isso. Eu estava ficando constante Aviso: array_flip (): só pode inverter os valores STRING e INTEGER! com ... item_load () e isso resolveu o problema.
Naidim
11

Você pode usar entity_metadata_wrapperno módulo API da entidade :

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

Você também pode fazer um loop em todas as coleções:

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