Enregistrez une nouvelle valeur avec entity_metadata_wrapper dans un champ d'entité qui est un tableau

9

Je dois enregistrer une nouvelle valeur dans un champ sur une entité et je me demandais s'il était possible d'utiliser entity_metadata_wrapper ou est-il uniquement possible de définir une valeur existante?

Andrew Welch
la source
c'est ainsi que j'ai été défini la valeur $ wrapper-> vimn_related_subjects-> set (array ($ key)); mais si je voulais ajouter une valeur à la fin du tableau? est-ce possible?
Andrew Welch
As-tu essayé $wrapper->vimn_related_subjects[] = $value;?
Clive

Réponses:

31

Lorsqu'il s'agit de champs à valeurs multiples, l'objet wrapper de métadonnées d'entité associé est une instance d' EntityListWrapper (il peut être judicieux de parcourir l'API pour consulter les méthodes disponibles. Notez également que cette classe implémente l' interface ArrayAccess )

Ainsi, la façon la plus simple d'ajouter de nouvelles valeurs à un EntityListWrapper est d'utiliser l'opérateur "[]":

$wrapper->field_example[] = $new_value;

Cela crée une nouvelle entrée et lui affecte la valeur. Avec ces méthodes, le delta (l'offset dans la liste de valeurs) est créé automatiquement. Vous pouvez également régler le décalage vous-même si vous le souhaitez. L'une des trois méthodes suivantes est équivalente:

$wrapper->field_example[$delta] = $new_value;
$wrapper->field_example->offsetSet($delta, $new_value);
$wrapper->field_example->get($delta)->set($new_value);

Dans les trois cas, cela écrasera les valeurs si le delta existe déjà et créera une nouvelle entrée dans le cas contraire.

Vous pouvez également définir directement un tableau de valeurs sur le champ lui-même. Les deux méthodes sont équivalentes:

$value = array
  0 => array('property_example' => 'hello'),
  1 => array('property_example' => 'world')
);
$wrapper->field_example = $value;
$wrapper->field_example->set($value);

Cependant, cela nécessite que vous connaissiez la structure interne du champ auquel vous vous affectez car vous n'utilisez pas l'encapsuleur de métadonnées du champ.

Enfin, vous pouvez vider un champ à valeurs multiples en le définissant sur une valeur vide. Les trois méthodes sont équivalentes:

$wrapper->field_example->set();
$wrapper->field_example = array();
$wrapper->field_example = NULL;
Alice Heaton
la source
"EntityMetadataWrapperException: tableau de propriétés de données inconnu. Dans EntityStructureWrapper-> getPropertyInfo ()" J'essaie votre deuxième approche, bien que je cible une langue spécifique. c'est-à-dire, $ wrapper-> language ($ lang) -> {$ field} -> set ($ new_array);
AlxVallejo
$w->field_allowed_regions->set(array(null));est la seule option de compensation qui a fonctionné pour mon champ de référence de taxonomie à valeurs multiples.
Incroyable
3

Je l'ai trouvé

$wrapper->field_example[]->set($new_value);

était un échec fatal. Mais

$wrapper->field_example[NULL]->set($new_value);

était autorisé.

dman
la source