Comment charger une collection de champs à partir d'un nœud?

72

J'ai un nœud qui contient quelques collections de champs.

Quand je regarde la node_load()sortie, je vois:

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

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

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

                )

        )

Quelle fonction d'API puis-je utiliser pour charger réellement les données de champ contenues dans la collection qui a un entity_id de 6, 7, 8, etc.?

Justin
la source

Réponses:

88

Doh! J'aurais dû regarder dans le module de collecte sur le terrain:

entity_load('field_collection_item', array($item_id))
Justin
la source
1
Je cherche une solution similaire. Comment écrivez-vous la sortie et les avez-vous placés dans un tableau rendu? Merci
swan
J'ai écrit un tas de fonctions personnalisées pour créer la mise en page de ces éléments. Malheureusement, ils renvoient du HTML, et non des tableaux rendables. Ce serait bien d'utiliser des tableaux de rendu, mais je ne suis pas tout à fait clair sur le point (je suis sûr qu'il y a une bonne raison de le faire, je n'ai juste pas trouvé d'explication qui résonne).
Justin
Merci. La collecte de champs est en effet utile pour simplifier les formulaires et les sorties, mais en ce qui concerne les requêtes personnalisées, il me semble devoir plonger dans les tableaux imbriqués, même à l'aide de entity_metadata_wrapper.
Cygne
Oh, j'ai écrit des enveloppes qui transforment simplement les tableaux denses en ce dont j'ai besoin.
Justin
entity_load () renvoie un ensemble de nœuds spécifiques à "entity" et avec eux, nous obtenons également les champs définis par l'utilisateur. Comment différencions-nous les champs utilisateur des champs d'une entité? Des indices?
Raj Pawan Gumdal
38

Il existe également une fonction wrapper qui fait le même tour:

field_collection_item_load($id, $reset = FALSE)

ou selon le commentaire, utilisez:

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

pour charger plusieurs collections (par exemple, si vous avez un bouton Ajouter plus de boutons).

Vasiliy Grotov
la source
5
Selon la réponse de @ vasiliy-grotov ci-dessus, vous pouvez également utiliser field_collection_item_load_multiple($ids = array(), $conditions = array(), $reset = FALSE)pour charger plusieurs collections (par exemple, si vous avez un "Ajouter plus" btn).
mediaashley
21

field_collection_field_get_entity () doit être utilisé pour charger la révision correcte.

Exemple d'utilisation:

$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
la source
1
Comment obtenir les champs de date assignés dans la collection de champs? J'ai utilisé la chose suivante: $ item = field_collection_field_get_entity ($ itemid); print $ item-> field_course_starts_on ['und'] [0] ['safe_value']; .Mais aucune valeur ne s’imprime pour cela.
harikris
Merci pour cela. J'obtenais constamment Avertissement: array_flip (): Ne peut inverser que les valeurs STRING et INTEGER! avec ... item_load () et cela a résolu le problème.
Naidim
11

Vous pouvez utiliser entity_metadata_wrapperle module API Entity :

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

Vous pouvez également boucler toutes les collections:

$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);
}
Laitovski
la source