web-dev-qa-db-fra.com

Comment parcourir les champs de la Field Collection?

Voici ci-dessous les données de chargement de code présentes dans la collection de champs.
$ field_collection = entity_load ('field_collection_item', $ ids = FALSE);

Dans chaque collection de champs, il y a beaucoup de champs, je voudrais parcourir chaque champ, y a-t-il un moyen de le faire? De l'aide?

6
Kiran Kumar

Je suis actuellement en train de "combattre" la largeur de ce module. Je ne sais pas si c'est la manière correcte/la plus simple, mais cela fonctionne (pour moi).

Vous devez d'abord charger les identifiants des champs de collecte de champs du nœud:

$fc_fields = field_get_items('node', $node, 'field_image_teaser');

// Extract the field collection item ids
$ids = array();
foreach ($fc_fields as $fc_field) {
    $ids[] = $fc_field['value'];
}

J'ai trouvé le code ci-dessus à Accès à une collection de champs (une question connexe).

Pour parcourir tous les champs, vous pouvez utiliser le code suivant:

//Get the entities
$collections = field_collection_item_load_multiple($ids);

//Loop over the array - if you have more than one entity
for ($i = 1; $i <= sizeof($collections); $i++) {
    $collection = $collections [$i];

    //Iterate over all member vars of the FieldCollectionItemEntity object
    foreach($collection as $key => $value) {
        //Look for fields - there are some other class vars, too.
        if (strpos ($key, 'field') !== false) {
            //Search for textfields 
            if (isset($value['und']) && is_array($value ['und']) && isset($value['und'][0]['value'])) {
                print "Field ".$key." ".$value['und'][0]['value'];
            }
        }
    }                   
} 
9
crashbus
$fc_fields = field_info_instances('field_collection_item', $field_name);

Cela vous aidera probablement.

3
AlxVallejo

La deuxième itération doit être de la manière ci-dessous. Pour les raisons suivantes,

  • Le résultat de field_collection_item_load_multiple ne sera pas un tableau basé sur 0.
  • Pour les images, l'URL ne sera pas dans l'index ['und'] [0] ['value']

    //Get the entities
    $collections = field_collection_item_load_multiple($ids);
    $loadedValues;
    //Loop over the array - if you have more than one entity
    $i = 0;
    foreach ($collections as $collection) {
    
        //Iterate over all member vars of the FieldCollectionItemEntity object
        foreach($collection as $key => $value) {
            //Look for fields - there are some other class vars, too.
            if (strpos ($key, 'field') !== false) {
                //Search for textfields 
                if (is_array($value) && isset($value['und']) && is_array($value ['und']) && (isset($value['und'][0]['value'])||isset($value['und'][0]['uri']))) {
                    // print "Field ".$key." ".$value['und'][0]['value'];
                    if(isset($value['und'][0]['value']))
                    {
                        $loadedValues[$i][$key] = $value['und'][0]['value'];
                    }
                    else if($value['und'][0]['uri'])
                    {
                        $loadedValues[$i][$key] = $value['und'][0]['uri'];
                    }
                }
            }
        }
        $i++;
    }
    
0
Kannan Ramamoorthy

Ce code de @AlxVallejo vous donnera la structure de la collection de champs (un tableau de définitions de champs). Vous pouvez l'utiliser pour parcourir votre entité en boucle après cela. Donc, développer est une suggestion:

$fc_fields = field_info_instances('field_collection_item', $field_name);
$field_list = array_keys($fc_fields);

foreach ($field_list as $key) {
  // access your current field using $field_collection_entity->{$key} 
}