web-dev-qa-db-fra.com

Extraction d'une partie de données spécifique d'un élément de collecte de champs

Je joue avec ça depuis plusieurs jours maintenant sans succès. Voici mes données de collection:

Nom de la collection: field_video_collection

Dans la collection, il y a un champ appelé: field_video_file_col

Mes champs s'impriment bien dans mon modèle field-collection-item--field_video_collection.tpl.php Personnalisé, j'ai suivi la documentation selon ce problème pour obtenir le nom de mon modèle et j'imprime simplement les champs comme <?php print render($content['field_video_file_col']); ?> etc ... dans ce modèle.

Maintenant, pour la partie amusante, j'aimerais extraire le fid pour chaque élément field_video_file_col De la collection dans un nœud donné et le rendre sous forme de variable imprimée. J'ai suivi la réponse à cette question ici sur Stack mais cela ne semble pas fonctionner pour moi. si je fais:

print '<pre>';
var_dump(get_defined_vars());
print '</pre>';

Je constate que je l'ai dans le cadre des données dont je dispose pour field_video_file_col

["field_video_file_col"]=>
          array(1) {
            ["und"]=>
            array(1) {
              [0]=>
              array(12) {
                ["fid"]=>
                string(3) "888"

Il me semble donc que le FID est 888 dans ce cas et je veux le rendre dans mon modèle. Ma fonction de prétraitement de nœud est en tant que telle:

function MYTHEME_preprocess_node(&$vars, $hook) {

    $entity_type = 'field_collection_item';
    $bundle_name = 'field_field_video_collection'; // Field name the collection is attached to
    $field_name = 'field_video_file_col'; // Field name within the field collection
    $video_file_fid = field_info_instance($entity_type, $field_name, $bundle_name);
    if ($video_file_fid) {
      $my_fid = $video_file_fid['fid'];
    }
}

Le résultat final nécessaire est que je dois rendre la variable dans mon field-collection-item --field_video_collection.tpl.php modèle comme:

<?php print $video_file_fid; ?>

... mais cela ne semble pas fonctionner. J'ai cherché partout et essayé de nombreuses incarnations différentes de ce code et de ces combinaisons, mais toujours pas de joie.

7
Danny Englander

J'utilise API d'entité lorsque je travaille avec des éléments de collection de champs. Voir: Créer et mettre à jour par programme la collection de champs avec l'API d'entité

Travailler avec des collections de champs peut faire quelque chose comme ceci:

// Wrap node with Entity API
$node_wrapper = entity_metadata_wrapper('node', $node);
// Get the first item from the muli-value field collection
$raw_collection = $node_wrapper->field_video_collection[0]->value();
// Wrap it with Entity API
$collection = entity_metadata_wrapper('field_collection_item', $raw_collection);
//dsm the old value
debug($collection->field_video_file_col->value());

Si vous connaissez déjà votre identifiant field_collection, vous pouvez simplement faire:

$collection = entity_metadata_wrapper('field_collection_item', $fid);
//dsm the old value
debug($collection->field_video_file_col->value());

MISE À JOUR:

utilisez le code ci-dessus dans MYTHEME_preprocess_node

MISE À JOUR 2:

Donc dans votre cas ce sera:

function MYTHEME_preprocess_node(&$vars, $hook) {
  if (empty($vars['nid'])) {
    return;
  }
  // Wrap node with Entity API
  $node_wrapper = entity_metadata_wrapper('node', $vars['nid']);
  // Get the first item from the muli-value field collection
  $raw_collection = $node_wrapper->field_video_collection[0]->value();
  // Wrap field collection with Entity API
  $collection = entity_metadata_wrapper('field_collection_item', $raw_collection);
  // print value
  $fid = $collection->field_video_file_col->value();
  debug($fid);
}

Vous pouvez également trouver une réponse sur Comprendre les valeurs de collecte de champs

8
milkovsky