web-dev-qa-db-fra.com

Comment définir une valeur sur une collection de champs à l'aide de l'encapsuleur de métadonnées d'entité

J'essaie de définir par programme une valeur sur un élément de collection de champs attaché à l'entité utilisateur.

Le champ de collecte de champs en question est intitulé, field_user_location.

J'avais initialement ceci ($ usr_wrapper étant un wrapper de métadonnées d'entité de l'entité utilisateur)

$usr_wrapper->field_user_location->field_land_phone->set($object['Phone Number']);

Cependant, cela ne semble pas fonctionner.

Comment obtenir des données sur une collection de champs via entity_metadata_wrapper()? Il n'y a pas beaucoup de documentation sur la façon de faire cela que je vois.

4
Jack Ryan

J'ai également trouvé la documentation pour les collections sur le terrain déroutante.

Les collections de champs ont besoin de leur propre wrapper de métadonnées d'entité. Ainsi, le code suivant fonctionnerait pour votre exemple:

$collection = entity_create('field_collection_item', array('field_name' => 'field_user_location'));
$collection->setHostEntity('user', $user);
$fc_wrapper = entity_metadata_wrapper('field_collection_item', $collection);
$fc_wrapper->field_land_phone->set($object['Phone Number']);

J'espère que cela aide quelqu'un d'autre à se cogner la tête à ce sujet.

4
a-fro

Selon votre exemple, le pourrait être:

global $user;
$usr_wrapper = entity_metadata_wrapper('user', $user);

// Create the collection entity and set its "Host".
$field_collection_item = entity_create('field_collection_item', array('field_name' => 'field_user_location')); // Name of collection field.
$field_collection_item->setHostEntity('node', $usr_wrapper->value());

// Now define the collection parameters.
$collection = entity_metadata_wrapper('field_collection_item', $field_collection_item);
$collection->field_land_phone = "0123"; // array("0123") in case of multi-valued field.
// $collection->field_land_phone->set("0123"); // Version using set(), use: set(array("0123")) for multi-valued field.

// Save.
$collection->save(); // Or: $usr_wrapper->save();

Vérifiez également Entity metadata wrappers page de documentation (recherchez Exemple d'utilisation de collections de champs ).


Voici un autre exemple qui ajoute une entrée à un nœud avec une collection de champs nommée field_activity_log:

  // Load the controller class file.
  module_load_include('inc', 'entity', 'includes/entity.controller');

  // Use the currently logged in user if a $uid argument is not defined.
  global $user;
  if (empty($uid)) {
    $uid = $user->uid;
  }

  $now = gmdate('Y-m-d H:i:s'); // Grab the current time.

  // Setup the values in the structure expected by the field_collection entity.
  $values = array(
    'field_name' => 'field_activity_log',
    'field_activity_log_date' => array(
      LANGUAGE_NONE => array(array('value' => $now)),
    ),
    'field_activity_log_message' => array(
      LANGUAGE_NONE => array(array('value' => $message)),
    ),
    'field_activity_log_user' => array(
      LANGUAGE_NONE => array(array('uid' => $uid)),
    ),
  );
  $entity = entity_create('field_collection_item', $values);

  // Attach the field_collection entity to the application node. This has to
  // happen separately so that it actually works -- you can't just specify
  // this via the $values array.
  $entity->setHostEntity('node', $node);

  // Save the entity. Since it's attached to the right application node, this
  // will both create the field_collection entity and update the application
  // node to point to the new field_activity_log record.
  $entity->save();
?>

Source: Exemple: ajout par programmation d'entrées de collection de champs à un nœud

Et cet exemple montre la mise à jour (chargement/édition/sauvegarde) d'une collection de champs existante dans un Entity Wrapper:

<?php
// Load the node by NID
$raw_node = node_load($nid);
// Wrap it with Entity API
$node = entity_metadata_wrapper('node', $raw_node);
// Get the first item from the muli-value field collection
$raw_collection = $node->field_collection->value();
// Wrap it with Entity API
$collection = entity_metadata_wrapper('field_collection_item', $raw_collection);
//dsm the old value
dsm($collection->field_example->value());
// Set a new value on the field_example textfield.
$collection->field_example = 'New value';
// Save the changes to the entity
$collection->save();
?>

Source: Exemple: créer et mettre à jour par programme la collection de champs avec l'API d'entité


Dépannage

En cas d'erreur lors de la définition de la valeur des données avec set(), assurez-vous qu'elle correspond au type et au format de données requis. Si votre entité ne sera pas enregistrée, recherchez les journaux pour toutes les exceptions de wrapper (drush ws --tail).

Voir aussi: Modification d'une collection de champs par défaut des champs hostEntity manquants sur SO

0
kenorb