Fitur masalah alur kerja dengan menghapus bidang

14

Misalkan saya memiliki jenis konten Persondengan bidang: Name, Age,Email

Jenis konten ini dikendalikan oleh Fitur yang disebut testsehingga saya dapat sumber mengontrolnya dan mendorongnya ke situs langsung.

Alur kerja saya seperti ini:

  • Saya menambahkan bidang baru di PersonpanggilPhone
  • secara lokal saya lakukan: drush fu test -y
  • Saya mengedit test.infountuk menambah nomor versi
  • Saya melakukan perubahan pada repositori saya
  • Saya mendorong fitur ke situs langsung (menyalin file fitur)
  • di situs langsung saya lakukan: drush fr test -y
  • di situs langsung saya lakukan: drush cc all

Kemudian bidang baru muncul di situs langsung itu Person.

Jika pada langkah pertama saya menghapus bidang Personisian tidak akan dihapus dari situs langsung. Bagaimana saya mengatasi ini? Saya tidak ingin harus menghapusnya secara manual dari UI di situs langsung.
Apakah alur kerja ini benar?

cherouvim
sumber
1
Gunakan uji drush fu -y --version-increment untuk secara otomatis menambah nomor versi
Mike

Jawaban:

9

Ini adalah pedang bermata dua, ini seperti ini untuk mencegah penghapusan data yang selalu merupakan hal yang baik. Tidak ada yang perlu dipecahkan, ini adalah perilaku yang diharapkan.

Ini adalah alur kerja yang sama yang kami gunakan dan telah dilakukan selama lebih dari setahun dan bekerja dengan sangat baik. Saya akan mengatakan itu benar tetapi itu adalah jawaban yang sangat subjektif.

digital
sumber
Dan jika saya benar-benar ingin menghapus bidang? Haruskah saya melihat ke kait pembaruan? (Saya seorang pemula D7).
cherouvim
3
Pembaruan kait akan ideal, atau menghapusnya secara manual.
digital
2
OK, saya juga bisa melakukannyadrush field-delete field
cherouvim
@cherouvim Jadi Anda harus melakukan itu setiap kali Anda membuat ulang fitur?
AlxVallejo
Hook_update_N () di file .install fitur akan berfungsi.
Mike
10

Cara yang benar untuk menghapus konten yang dibuat Fitur adalah melalui hook_update_N (yang harus diterapkan dalam file your_module.install).


Gagasan utama dengan Fitur adalah mengelola konfigurasi dengan kode. Penggunaan hook_update_Nkonsisten dengan itu, karena penghapusan bidang dalam kode (yang dapat dikelola dengan kontrol versi) - sedangkan perintah yang setara drush field-delete fieldtidak dipanggil dari kode yang dikelola; ini adalah langkah baris perintah terpisah yang perlu Anda lakukan (dan ingat untuk melakukan).

smokris
sumber
Mengapa? Tidak akan drush field-delete fieldbekerja dengan baik?
cherouvim
5
Tentu, itu akan berhasil, dan mungkin solusi yang lebih sederhana. Tetapi ide utama dengan Fitur adalah mengelola konfigurasi dengan kode. Penggunaan hook_update()konsisten dengan itu, karena penghapusan bidang dalam kode (yang dapat dikelola dengan kontrol versi) - sedangkan perintah drush tidak dipanggil dari kode yang dikelola; ini adalah langkah baris perintah terpisah yang perlu Anda lakukan (dan ingat untuk melakukan).
smokris
Di file mana dari fitur yang akan saya gunakan hook_update ()? hook_update () mengambil objek node sebagai parameter, jadi tidak mungkin untuk memberikannya objek node saat mengaktifkan fitur.
subhojit777
@ subhojit777: Ups, saya ditautkan ke halaman dokumentasi hook yang salah. Saya baru saja memperbaiki tautannya; silakan lihat dokumen untuk hook_update_N.
smokris
@smokris :) Saya sebutkan bahwa kaitkan jawaban saya
subhojit777
2

Buat file baru bernama "your_feature_name.install"

Di dalam file menyatakan hook_update_N , di sana Anda dapat menggunakan field_delete_field () dan tentukan nama bidang yang ingin Anda hapus sebagai parameter.

Jalankan pembaruan.php dan bidang akan dihapus.

subhojit777
sumber
0

Jika Anda menggunakan field_phonedi area lain, Anda mungkin hanya ingin menghapusnya dari tipe konten Person Anda, tetapi tidak sepenuhnya menghapusnya dari situs Anda. Buat YOUR_FEATURE_NAME.installfile secara manual di folder fitur Anda seperti:

/**
 * Implements hook_update_N().
 *
 * Removes field_phone from Person content type.
 */
function YOUR_FEATURE_NAME_update_7001() {
  if ($instance = field_info_instance('node', 'field_phone', 'person')) {
    field_delete_instance($instance);
  }
  field_purge_batch(500);
  features_revert_module('YOUR_FEATURE_NAME');
}

Jika Anda menghapus ini dari Paragraf Orang dan bukan Tipe Konten Orang, Anda bisa mengubah pernyataan bersyarat pertama menjadi sesuatu seperti ini:

if ($instance = field_info_instance('paragraphs_item', 'field_phone', 'person')) {
  ...
}
jimafisk
sumber