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.


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.


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).

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.