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


18

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 () 'i veya ikisini de 6001 (), 6002 () sırayla arayın.

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

Yanıtlar:


19

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 ve hangilerinin çalıştırılacağını tespit edecektir update.php. Drupal 6'da hangi güncellemelerin yapılacağını otomatik olarak seçecektir, ancak bunu Drupal 7'de mümkün olmasa da değiştirebilirsiniz.

Drupal, son çalıştırma güncellemesinin numarasını kaydederek hangi güncellemelerin gerekli olduğunu algılar. Bu, veritabanındaki değişiklikler olabilir ve bu da Drupal 7'deki güncellemeleri yeniden çalıştırmanızı sağlar. 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.


15

Kancaların amacı farklıdır.

  • hook_install () bir modül kurulduğunda ç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üncelleştirilmiş ş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şlevlerinin uygulanmasından çağrılması hook_install()yanlıştır, çünkü bir güncelleme işlevini başka bir işlevden çağırmak yanlıştır; iki veya daha fazla güncelleme işlevinden yürütülmesi gereken bir kod varsa, bu kod güncelleme işlevlerinden çağrılan bir işleve ve hook_install()gerekirse gönderilmelidir.


5

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

Ya drush onu ç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ü?


1

hook_install mymod.moduledosyada çalışmaz .

Sen yere sahip hook_installve hook_uninstallayrı bir dosyadamymod.install

Sanırım bu hook_update_N()damymod.install


Soru güncellendikten sonra cevap verin:

Bir bağlantıdan alıntı yaparak , 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şmedi. Aslında Eclipse PDT için Subversive kullanıyorum ve bu nedenle bilgi dosyalarım sürüm numaraları asla güncellenmez. Böylece, hook_update_6001 benim update.php tarafından çağrılmadı.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.