it-swarm.com.de

Wie löscht man einen Feldwert mit entity_metadata_wrapper ()?

Angenommen, ich habe eine Entität mit einem Feld field_foo Darauf und möchte den Wert dieses Felds löschen.

Was soll ich an $wrapper->set() übergeben?

Ich habe versucht, NULL und array() und beide erzeugen eine Fehlermeldung.

20
joachim

Das Problem ist, dass Sie einen leeren Wert festlegen müssen, der mit dem Datentyp Ihres Felds kompatibel ist. Wenn Sie dies nicht tun, wird eine Ausnahme ausgelöst. Das Übergeben von NULL oder array(), wenn eine Zeichenfolge erwartet wird, führt daher zu einem Fehler.

Beachten Sie außerdem, dass die von Ihnen übergebenen Daten auch davon abhängen, ob es sich bei Ihrem Feld um einen einzelnen Wert, ein mehrwertiges Feld oder ein Feld mit mehreren Eigenschaften handelt.

Wenn Ihr Feld ein einzelner Wert ist (und der Wrapper für das Feld daher eine Instanz von EntityValueWrapper ist), sollten Sie ihm einen leeren Wert zuweisen, der mit dem Datentyp kompatibel ist in Frage . Zum Beispiel sind die beiden folgenden Methoden äquivalent:

$wrapper->title = '';
$wrapper->title->set('');

Die folgenden drei Beispiele lösen jedoch eine Ausnahme aus, da die Datentypen nicht mit dem Feld title kompatibel sind:

$wrapper->title->set();
$wrapper->title->set(NULL);
$wrapper->title->set(array());

Wenn Ihr Feld ein Feld mit mehreren Eigenschaften ist (z. B. ein formatiertes Textfeld, das sowohl eine value- als auch eine format -Eigenschaft definiert) und somit eine Instanz von EntityStructureWrapper , dann ist array() oder NULL der richtige leere Wert. Sie können also Folgendes tun:

$wrapper->field_formatted_text = array();
$wrapper->field_formatted_text = NULL;

In diesem Fall hätte das Übergeben einer leeren Zeichenfolge einen Fehler ausgelöst. Beachten Sie, dass Sie stattdessen die Eigenschaft value leer lassen könnten. In diesem Fall ist eine Zeichenfolge der richtige Datentyp:

$wrapper->field_formatted_text->value = '';

Wenn Ihr Feld ein mehrwertiges Feld ist (und Ihr Wrapper somit eine Instanz von EntityListWrapper ist), sind array oder NULL die richtigen leeren Werte und Die folgenden drei Zeilen sind äquivalent:

$wrapper->field_example_multiple->set();
$wrapper->field_example_multiple = array();
$wrapper->field_example_multiple = NULL;

Hinweis: Das Aufrufen der Methode clear für die Wrapper entspricht nicht dem Festlegen eines leeren Werts für das Feld. Wenn das Feld auf einen leeren Wert gesetzt ist, ruft es EntityMetadataWrapper :: updateParent auf dem übergeordneten Wrapper des Felds auf. Dies stellt unter anderem sicher, dass der durch hook_entity_property_info definierte setter callback Aufgerufen wird. Das Aufrufen von clear funktioniert nicht.

24
Alice Heaton

Neben anderen Antworten und Kommentaren, wenn das Feld mehrfach und erforderlich ist, wie bereits erwähnt, können Sie nicht verwenden

$wrapper->field_example_multiple->set()

$wrapper->field_example_multiple->set(NULL)

noch einmal $wrapper->field_example_multiple->set(array()),

stattdessen können Sie Folgendes verwenden, wenn Sie das Feld von allen Werten löschen möchten:

$wrapper->field_example_multiple->set(array(NULL));

Tatsächlich funktioniert dies unabhängig davon, ob das Feld mit mehreren Werten auf "erforderlich" gesetzt ist oder nicht. Daher würde ich empfehlen, dies immer zu verwenden, um sicherzustellen, dass Ihr Code robust ist.

(Wenn das Feld "erforderlich" ist, sollten Sie es möglicherweise ohnehin nicht vollständig löschen, aber Ihr Code tut dies möglicherweise als ersten Schritt, um die gesamte Entität oder ähnliches zu löschen. Es kann also vorkommen, dass dies der Fall ist sei einfach legitim.)

3
Martin Q

Es scheint, dass die in den anderen Kommentaren aufgeführten Komplexitäten nur für ein erforderliches Feld relevant sind. Wenn das Feld nicht benötigt wird, sollte dies ziemlich einfach sein:

$wrapper->field_foo = NULL;

Mit dem Wrapper können Sie die Eigenschaften des Felds überprüfen:

$properties = $wrapper->getPropertyInfo();
$field_required = !empty($properties['field_foo']['required']);

Abhängig vom Kontext können Sie die Eigenschaften des einen Felds auch einfach abrufen, indem Sie:

$wrapper->getPropertyInfo('field_foo');
2
Giles B

Eine andere Lösung für dieses Problem könnte EntityMetadataWrapper::clear Sein.

$entity_wrapper->field->clear()

1
Mouneer