Bagaimana cara mendapatkan hook_install () untuk menjalankan semua hook_update_N ()?

18

Bagaimana saya bisa mendapatkan hook_install () untuk menjalankan semua pembaruan yang saya miliki untuk modul saya? Saya memiliki file mymod.install di dalamnya.

saya telah mencoba

function mymod_install() {
  mymod_update_6001();
}

tapi sepertinya tidak melakukan apa-apa. Jika saya memiliki mymod_update_6002 () apakah saya masih akan menelepon 6001 (), panggil saja 6002 () atau panggil keduanya dalam urutan 6001 (), 6002 ().

Saya pikir akan masuk akal untuk menjalankan semua pembaruan ketika Anda menginstal modul secara default.

Lucy
sumber

Jawaban:

19

Anda seharusnya tidak mendapatkan kait instal Anda untuk menjalankan pembaruan. Ketika modul dipasang untuk pertama kalinya, tidak ada pembaruan yang diperlukan.

Pembaruan digunakan ketika modul sudah diinstal (database atau variabel telah dibuat). Dalam hal ini, Anda tidak ingin menginstal ulang modul karena akan menghapus semua data, alih-alih Anda membuat kait update_N. Drupal akan mendeteksi pembaruan mana yang diperlukan dan yang akan dijalankan update.php. Dalam Drupal 6 itu akan secara otomatis memilih pembaruan mana yang harus dilakukan, tetapi Anda dapat mengubahnya, sementara ini tidak mungkin di Drupal 7.

Drupal mendeteksi pembaruan mana yang diperlukan dengan menyimpan nomor pembaruan yang terakhir kali dijalankan. Ini bisa berupa perubahan dalam database, yang akan memungkinkan untuk menjalankan kembali pembaruan di Drupal 7. Pembaruan yang dijalankan kembali biasanya merupakan ide yang buruk dan paling sering akan menyebabkan kesalahan dan dalam beberapa kasus dapat mengacaukan data Anda.

Selalu ingat untuk membuat cadangan basis data Anda sebelum menjalankan pembaruan.

googletorp
sumber
15

Tujuan kait berbeda.

  • hook_install () dipanggil ketika modul diinstal; itu berarti modul tidak diinstal sebelumnya, dan oleh karena itu, tidak perlu diperbarui.
  • hook_update_N () dipanggil ketika modul sudah diinstal, dan perlu diperbarui.

Jika ada beberapa tugas yang perlu dilakukan saat modul diinstal, dan ketika modul diperbarui, maka kode harus ada di kedua kait. Tidak ada modul yang memanggil semua kait pembaruan selama instalasi, dan itu akan sangat salah ketika fungsi pembaruan memperbarui skema tabel database yang digunakan dari modul; hook_schema () harus selalu mengembalikan skema yang diperbarui, dan memperbarui skema juga dengan fungsi pembaruan akan salah.

Kode yang Anda tulis tidak berfungsi karena memanggil salah satu fungsi pembaruan tidak secara otomatis menjalankan semua fungsi pembaruan lainnya.
Memanggil fungsi pembaruan dari implementasi hook_install()salah, karena salah memanggil fungsi pembaruan dari yang lain; jika ada beberapa kode yang perlu dijalankan dari dua atau lebih fungsi pembaruan, maka kode itu harus ditempatkan dalam fungsi yang dipanggil dari fungsi pembaruan, dan dari hook_install(), jika perlu.

kiamlaluno
sumber
5

Kait instal hanya dipanggil saat modul baru saja diinstal, sehingga tidak perlu ada pembaruan. Pembaruan dijalankan hanya ketika modul sudah diinstal, sehingga dapat menerapkan perubahan tambahan.

Untuk memaksa fungsi pembaruan dijalankan saat diinstal, Anda harus mengubah versi skema Anda, misalnya:

function mymod_install() {
  // Reset the schema version, so our update hooks can be processed during the installation.
  drupal_set_installed_schema_version('mymod', '7000');
  // Then run the updates as usual.
  mymod_update_7001();
}

Atau menjalankannya dari drush: drush -y updb.

Lihat juga: Apakah mungkin untuk memaksa kait pembaruan modul Anda untuk berjalan?

kenorb
sumber
1

hook_install tidak akan berfungsi dengan dalam mymod.modulefile.

Anda harus menempatkan hook_installdan hook_uninstalldalam file terpisahmymod.install

Saya kira itu hook_update_N()juga harus ditempatkan dimymod.install


Jawab setelah pertanyaan diperbarui:

Mengutip dari tautan , Silakan periksa nomor versi Anda di file info.

Karena saya mengembangkan secara pribadi dan bukan untuk kontribusi, bidang 'VERSION' saya di file .info modul saya kosong atau tidak berubah ketika saya memperbarui modul. Saya sebenarnya menggunakan Subversif untuk gerhana PDT dan karenanya info saya nomor versi file tidak pernah diperbarui. Jadi, hook_update_6001 saya TIDAK dipanggil oleh update.php.

Shoaib Nawaz
sumber