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.?

Réponses:


88

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

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

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).


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.
}

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);
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.