Cara terbaik untuk menjatuhkan bidang dari jenis konten

21

Apa cara terbaik untuk menghapus bidang Drupal 7 dari jenis konten yang ditentukan melalui GUI? Saya ingin menggunakan hook_update_N agar perubahan dapat disebarkan ke beberapa server saat menjalankan update.php. Namun sepertinya saya tidak dapat menemukan solusi. db_drop_table () akan masuk akal bagi saya untuk skema yang ditentukan khusus, tetapi tidak untuk jenis / bidang konten yang didefinisikan melalui GUI.

barista amatir
sumber
Anda membuat modul khusus untuk menentukan jenis konten?
iStryker
iStryker: membuat jenis konten melalui antarmuka admin, menambahkan beberapa bidang, lalu diekspor melalui Fitur. Tapi sekarang saya ingin menghapus salah satu dari bidang-bidang itu secara terprogram.
amatir barista
Tercatat bahwa D5 menyediakan fungsi content_field_instance_delete () , didokumentasikan di sini dan di sini , tetapi fungsi itu tidak tersedia untuk D7. Aneh juga bidang apa yang digunakan. Instal di inti D7 gunakan untuk menghapus bidang: _update_7000_field_delete_instance () - fungsi "internal" khusus yang tidak tersedia untuk digunakan orang lain. Untuk sesuatu yang sangat penting seperti bidang, bagi saya tampaknya harus ada fungsi "publik" yang tersedia di suatu tempat, dan itulah yang saya cari.
amatir barista
Saat ini fungsi publik "kandidat" saya adalah field_delete_instance ().
barista amatir

Jawaban:

18

Ada dua fungsi api untuk menghapus bidang:

Jika Anda tidak ingin menggunakan kembali bidang tersebut, mungkin akan sedikit lebih bersih untuk menghapus seluruh bidang alih-alih hanya menghapus contohnya pada jenis konten yang dipermasalahkan. Hanya Anda yang bisa menjadi hakim untuk itu.

googletorp
sumber
2
Bekerja seperti pesona. Fungsi tidak mengembalikan argumen apa pun, jadi ketika menggunakan dalam kombinasi dengan hook_update_N () saya akan merekomendasikan melakukan pengawas () untuk mencatat perubahan pembaruan Anda.
amatir barista
9

Ya, field_delete_instance () adalah fungsi untuk menghapus instance bidang.

Perhatikan bahwa field_delete_instance()panggilan secara otomatis field_delete_field()jika tidak ada contoh yang tersisa, jadi field_delete_instance()kemungkinan besar semua yang Anda butuhkan.

_update_7000_field_delete_instance()dirancang untuk fungsi pembaruan inti. Contoh: dalam fungsi pembaruan x_update_7000(), Anda menggunakan field_delete_instance(). Kemudian x_update_7001(), Anda mengubah {field_config}tabel dengan cara yang tidak konsisten dan field_delete_instance()jelas perlu diubah juga.

Tetapi x_update_7000()panggilan sekarang untuk field_delete_instance()akan menghasilkan kesalahan karena tabel masih dalam struktur yang lama. Namun, situasi untuk modul yang disumbangkan berbeda, karena mereka harus selalu dieksekusi setelah semua pembaruan inti dan karenanya perlu bekerja dengan versi inti terbaru.

Namun, ini adalah pola yang mungkin ingin Anda gunakan untuk fungsi API Anda sendiri yang Anda gunakan dalam fungsi pembaruan.

Selain itu, fungsi-fungsi _update ini tidak mengeksekusi kait karena hasilnya tidak dapat diprediksi (misalnya karena modul yang menjalankan pembaruan mungkin dinonaktifkan).

Berdir
sumber