Apa cara yang tepat untuk secara terprogram menghapus satu entri bidang tertentu untuk bidang multi-entri dari satu entitas tertentu? (itu bidang khusus dan entitas spesifik, bukan tipe bidang atau instance dan tipe entitas)
Berikut adalah beberapa kemungkinan yang saya perhatikan yang tidak berhasil:
- Memuat entitas dengan
entity_load()
, mengatur entri bidang ke = null atau = array (), lalu menyimpan denganfield_attach_update()
. Ini yang paling dekat yang saya temukan tetapi meninggalkan entri bidang nol zombie di database yang muncul sebagai baris kosong pada formulir sampai formulir disimpan danhook_field_is_empty()
dapat menendang (hook_field_is_empty()
dikonfigurasi sehingga = null atau = array () akan menandai kosong). - Memuat entitas dengan
entity_load()
, membuka kunci entri bidang dengan kunci, lalu menyimpan denganfield_attach_update()
. Ini sepertinya tidak melakukan apa-apa - tampaknya Drupal menginterpretasikan entri yang tidak ada di sana sebagai tanda untuk tidak memodifikasinya. (Anehnya, saya juga terkadang mendapatkan batas waktu kedaluwarsa waktu permintaan maksimum saat mencoba pendekatan ini) field_attach_delete()
- ini terlalu tumpul: ini membunuh semua bidang untuk entitasfield_purge_data()
- lebih baik, tetapi masih terlalu tumpul: itu membunuh semua entri bidang, bukan entri tertentu
Jadi untuk memperjelas, saya punya kode yang menemukan (dan memuat) entitas yang memiliki bidang yang memiliki banyak entri, dan menemukan entri khusus pada bidang itu yang perlu dihapus. Saya ingin menghapus entri itu sepenuhnya, tanpa menyentuh entri lain atau bidang lain pada entitas.
Saya perlu melakukan ini sebagai bagian dari pembersihan migrasi Drupal8.
Setelah beberapa percobaan, saya menemukan bahwa iterasi dan kemudian menggunakan unset () pada delta dapat membunuhnya. Contoh saya menghapus tag (karenanya saya mencari 'target_id', bukan 'nilai' seperti yang sering Anda lakukan untuk bidang lain.
Dan sesudahnya, jika sukses, maka
$object->save();
sumber
Untuk Drupal 8, untuk menghapus bidang dari suatu entitas:
Ini akan memanggil metode ajaib __unset () dari ContentEntityBase:
Jangan lupa bahwa, untuk bertahan pada perubahan Anda, Anda perlu menelepon
Setelah Anda melakukan semua perubahan Anda.
sumber
Ini cara yang lebih baik:
sumber
metode yang disukai saat ini akan menggunakan entitas_metadata_wrapper
ini adalah tutorial terbaik tentang EMW yang pernah saya lihat di http://deeson-online.co.uk/labs/programatically-access-field-data-using-entitymetadatawrapper-drupal
sumber