Wie kann ein bestimmter Feldeintrag für ein Feld mit mehreren Einträgen programmgesteuert aus einer bestimmten Entität gelöscht werden? (Das sind bestimmte Felder und bestimmte Entitäten, keine Feldtypen oder Instanzen und Entitätstypen.)
Hier sind einige Möglichkeiten, die ich untersucht habe und die nicht funktionieren:
- Laden Sie die Entität mit
entity_load()
, setzen Sie den Feldeintrag auf = null oder = array () und speichern Sie dann mitfield_attach_update()
. Es ist das nächste, das ich gefunden habe, aber es hinterlässt einen Zombie-Null-Feldeintrag in der Datenbank, der in Formularen als leere Zeile angezeigt wird, bis das Formular gespeichert wird undhook_field_is_empty()
aktiviert werden kann (hook_field_is_empty()
ist so konfiguriert, dass = null oder = array () markiert wird als leer). - Laden der Entität mit
entity_load()
, Deaktivieren des Feldeintrags mit der Taste und Speichern mitfield_attach_update()
. Dies scheint nichts zu bewirken - es scheint, dass Drupal den Eintrag, der nicht vorhanden ist, als Zeichen interpretiert, um ihn nicht zu ändern. (Seltsamerweise bekomme ich manchmal auch maximale Zeitüberschreitungen beim Abfragen, wenn ich diesen Ansatz versuche.) field_attach_delete()
- das ist viel zu stumpf: es löscht alle Felder für die Entitätfield_purge_data()
- Besser, aber immer noch zu stumpf: Es werden alle Einträge des Feldes gelöscht, keine spezifischen Einträge
Zur Verdeutlichung habe ich Code, der eine Entität mit einem Feld mit mehreren Einträgen findet (und lädt) und in diesem Feld einen bestimmten Eintrag findet, der entfernt werden muss. Ich möchte diesen Eintrag vollständig entfernen, ohne andere Einträge oder andere Felder in der Entität zu berühren.
Ich musste dies im Rahmen einer Drupal8-Migrationsbereinigung tun.
Nach einigem Experimentieren stellte ich fest, dass das Iterieren und anschließende Verwenden von unset () im Delta dazu führen kann, dass es nicht mehr funktioniert. Mein Beispiel war das Entfernen eines Tags (daher suche ich nach 'target_id' und nicht nach 'value', wie Sie es oft für andere Felder tun würden).
Und danach, wenn Erfolg, dann
$object->save();
quelle
So löschen Sie in Drupal 8 ein Feld aus einer Entität:
Dies ruft die magische Methode __unset () von ContentEntityBase auf:
Vergessen Sie nicht, dass Sie anrufen müssen, um Ihre Änderungen beizubehalten
Nachdem Sie alle Änderungen vorgenommen haben.
quelle
Das ist besser so:
quelle
Die derzeit bevorzugte Methode würde den entity_metadata_wrapper verwenden
Dies ist das beste Tutorial im EMW, das ich gesehen habe http://deeson-online.co.uk/labs/programatically-access-field-data-using-entitymetadatawrapper-drupal
quelle