Speichern Sie einen neuen Wert mit entity_metadata_wrapper in einem Entitätsfeld, das ein Array ist

9

Ich muss einen neuen Wert in einem Feld einer Entität speichern und habe mich gefragt, ob es möglich ist, entity_metadata_wrapper zu verwenden, oder ob nur ein vorhandener Wert festgelegt werden kann.

Andrew Welch
quelle
Auf diese Weise wurde der Wert $ wrapper-> vimn_related_subjects-> set (array ($ key)) festgelegt. aber wenn ich am Ende des Arrays einen Wert hinzufügen wollte? ist das möglich?
Andrew Welch
Hast du es versucht $wrapper->vimn_related_subjects[] = $value;?
Clive

Antworten:

31

Beim Umgang mit mehrwertigen Feldern ist das zugeordnete Entity-Metadaten-Wrapper-Objekt eine Instanz von EntityListWrapper. (Es kann sinnvoll sein, die API zu durchsuchen, um die verfügbaren Methoden anzuzeigen . Beachten Sie auch, dass diese Klasse die ArrayAccess-Schnittstelle implementiert. )

Der einfachste Weg, einem EntityListWrapper neue Werte hinzuzufügen, ist die Verwendung des Operators "[]":

$wrapper->field_example[] = $new_value;

Dadurch wird ein neuer Eintrag erstellt und ihm der Wert zugewiesen. Bei diesen Methoden wird das Delta (der Versatz innerhalb der Werteliste) automatisch erstellt. Sie können den Offset auch selbst einstellen, wenn Sie dies wünschen. Jede der drei folgenden Methoden ist äquivalent:

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

In allen drei Fällen werden dadurch Werte überschrieben, wenn das Delta bereits vorhanden ist, und wenn nicht, wird ein neuer Eintrag erstellt.

Sie können auch direkt ein Wertearray für das Feld selbst festlegen. Beide Methoden sind gleichwertig:

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

Dies setzt jedoch voraus, dass Sie die interne Struktur des Felds kennen, dem Sie zuweisen, da Sie den Metadaten-Wrapper des Felds nicht verwenden.

Schließlich können Sie ein Feld mit mehreren Werten leeren, indem Sie es auf einen leeren Wert setzen. Alle drei Methoden sind gleichwertig:

$wrapper->field_example->set();
$wrapper->field_example = array();
$wrapper->field_example = NULL;
Alice Heaton
quelle
"EntityMetadataWrapperException: Unbekanntes Dateneigenschafts-Array. In EntityStructureWrapper-> getPropertyInfo ()" Ich versuche Ihren zweiten Ansatz, obwohl ich auf eine bestimmte Sprache abziele. dh $ wrapper-> language ($ lang) -> {$ field} -> set ($ new_array);
AlxVallejo
$w->field_allowed_regions->set(array(null));ist die einzige Clearing-Option, die für mein mehrwertiges Taxonomie-Referenzfeld funktioniert hat.
Unglaublich
3

ich habe das gefunden

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

war ein fataler Misserfolg. Aber

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

war erlaubt.

dman
quelle