web-gelistirme-sc.com

Tüm hook_update_N () 'i çalıştırmak için hook_install () nasıl edinilir?

Modülüm için sahip olduğum tüm güncellemeleri çalıştırmak için hook_install () 'i nasıl edinebilirim? İçinde mymod.install dosyası var.

Denedim

function mymod_install() {
  mymod_update_6001();
}

ama hiçbir şey yapmıyor gibi görünüyor. Bir mymod_update_6002 () varsa, yine de 6001 (), 6002 () veya ikisini de 6001 (), 6002 () sırasıyla çağırırdım.

Varsayılan olarak bir modül yüklediğinizde tüm güncellemeleri çalıştırmanın sağduyu olacağını düşündüm.

18
Lucy

Güncellemeleri çalıştırmak için yükleme kancanızı almamalısınız. Bir modül ilk kez takıldığında güncelleme gerekmez.

Güncellemeler, modül zaten kurulu olduğunda kullanılır (veritabanı veya değişkenler oluşturulmuştur). Bu durumda, tüm verileri sileceği için modülü yeniden yüklemek istemezsiniz, bunun yerine update_N kancaları yaratırsınız. Drupal hangi güncellemelerin gerekli olduğunu tespit edecek ve bunlar update.php. Drupal 6 içinde hangi güncellemelerin yapılacağını otomatik olarak seçecektir, ancak bunu değiştirebilirsiniz, ancak bu Drupal 7] 'de mümkün değildir.

Drupal, son çalıştırılan güncelleme sayısını kaydederek hangi güncellemelerin gerekli olduğunu algılar. Bu, veritabanındaki değişiklikler olabilir ve bu da Drupal 7) Güncellemeleri yeniden çalıştırmanıza izin verir. Güncellemeleri yeniden çalıştırmak genellikle kötü bir fikirdir ve çoğu zaman hatalara neden olur ve bazı durumlarda verilerinizi bozabilir.

Güncellemeleri çalıştırmadan önce her zaman veritabanınızı yedeklemeyi unutmayın.

19
googletorp

Kancaların amacı farklıdır.

  • hook_install () bir modül takıldığında çağrılır; modülün daha önce kurulmadığı anlamına gelir ve bu nedenle güncellenmesi gerekmez.
  • hook_update_N () bir modül zaten kurulduğunda çağrılır ve güncellenmesi gerekir.

Hem modül takıldığında hem de modül güncellendiğinde yapılması gereken bazı görevler varsa, kodun her iki kancada da bulunması gerekir. Yükleme sırasında tüm güncelleme kancalarını çağıran bir modül yoktur ve özellikle güncelleme işlevleri modülden kullanılan veritabanı tablolarının şemasını güncellediğinde yanlış olur; hook_schema () her zaman güncellenen şemayı döndürmelidir ve şemayı güncelleme işlevleriyle de güncellemek yanlış olur.

Yazdığınız kod çalışmaz, çünkü güncelleme işlevlerinden birini çağırmak diğer tüm güncelleme işlevlerini otomatik olarak yürütmez.
Güncelleme işlevlerini hook_install() uygulamasından çağırmak yanlıştır, çünkü başka bir işlevden güncelleme işlevini çağırmak yanlıştır; iki veya daha fazla güncelleme işlevinden yürütülmesi gereken bazı kodlar varsa, bu kod güncelleme işlevlerinden ve gerekirse hook_install() öğesinden çağrılan bir işleve yerleştirilmelidir.

15
kiamlaluno

Kurulum kancası sadece modül yeni takıldığında çağrılır, bu nedenle herhangi bir güncellemeye gerek yoktur. Güncellemeler yalnızca modül zaten kurulu olduğunda yürütülür, böylece ek değişiklikler uygulanabilir.

Güncelleme işlevlerini yükleme sırasında çalışmaya zorlamak için şema sürümünüzü değiştirmeniz gerekir, örneğin:

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();
}

Veya bunu acele ile çalıştırın: drush -y updb.

Ayrıca bkz .: Modülünüzün güncelleme kancasını çalışmaya zorlamak mümkün mü?

5
kenorb

hook_install mymod.module dosyasında çalışmaz.

Ayrı bir dosyaya hook_install Ve hook_uninstall Yerleştirmelisiniz mymod.install

Sanırım hook_update_N() de mymod.install


Soru güncellendikten sonra cevap verin:

link 'den alıntı yapılıyor, lütfen bilgi dosyasındaki sürüm numaranızı kontrol edin.

Özel olarak geliştirdiğimden ve katkı için olmadığımdan, modülümü güncellediğimde modülümün .info dosyasındaki 'VERSION' alanım boş veya değişmemiş. Aslında Eclipse PDT için Subversive kullanıyorum ve bu nedenle bilgi dosyaları sürüm numaraları asla güncellenmez. Böylece, hook_update_6001 benim update.php tarafından çağrılmadı.

1
Shoaib Nawaz