Modülünüzün güncelleme kancasını çalışmaya zorlamak mümkün mü?


18

Date iCal modülünün yazarıyım ve üzerinde çalıştığım yeni ana sürüm (3.x), 2.x yüklü kullanıcılar için iki bölümlü bir şema güncellemesi gerektiriyor. Bu değişiklikleri yapan güncelleme kancasını yazdım, ancak kullanıcılarımdan biri veritabanı güncelleme komut dosyasını çalıştıramazsa, iCal feed'leri ithalatçılarıyla ilgili bir hata mesajı alacaklar.

Doğru çözüm, güncelleme komut dosyasını çalıştırmalarıdır ... ancak içeri girer ve iletiden kurtulmak için içe aktarıcılarını el ile değiştirirlerse, içe aktarıcılar kalıcı olarak kırık kalır (çünkü şema güncellemesinin ikinci kısmı yürütüldü).

Güncellemeyi çalıştırmayan kullanıcılara mesaj göstermenin bir yolu var mı? Ya da 3.x 2.x'in üzerine yüklendiğinde ilk kez bir sayfa yüklendiğinde güncelleme kancasını zorla çalıştırır mısınız?


2
Sana yapabileceğini hayal ediyorum variable_set()başarıyla bir iç bakmak olabilir çalıştırıldığında bu değişkeni ayarlar Güncellemenizin işlevinde _preprocess_page()ancak bu kadar emin dostu bu nasıl olacağı performans ona her zaman bakıyor olurduk.
Jimajamma

Yanıtlar:


4

Jimajamma'nın yorumuna kadar uzanan:

Bir do variable_set()) (başarıyla bir _preprocess_page içine bakmak olabilir çalıştırıldığında bu değişkeni ayarlar Güncellemenizin işlevinde

ve bunu her sayfa yüklemesinde kontrol etmek yerine yalnızca yönetici alanına göz atıyorsanız ve yüklü sürüm 3.0 ise (3.1, 3.2, eski sürümü yükseltme yolu olarak desteklemeyi bırakıp durdurmadığınızı kontrol edin).

Ayrıca , durum raporu sayfasında geri bildirim sağlamak için hook_requirements'tan yararlanın:

Kurulum gereksinimlerini kontrol edin ve durum raporlaması yapın.
(...)
'Çalışma zamanı' aşaması saf kurulum gereksinimleriyle sınırlı değildir, aynı zamanda bakım görevleri ve güvenlik sorunları gibi daha genel durum bilgileri için de kullanılabilir.


15

Modül güncellemesini zorlamanın birkaç yolu vardır.

  1. Güncelleme fonksiyonunun doğrudan çağrılması.

    $sandbox = [];
    module_load_include('install', 'FOO');
    FOO_update_7001($sandbox);
  2. Şema sürümünü ilgi çekici noktaya sıfırlama ve güncelleştirmeleri her zamanki gibi yeniden çalıştırma.

    drupal_set_installed_schema_version('module_name', '7000');

    Veya yalnızca en son güncelleme şemasını yeniden çalıştırmak için sıfırlayın:

    drupal_set_installed_schema_version('foo', drupal_get_installed_schema_version('foo') - 1);

    Notlar:

    • Bu yerleştirilebilir hook_install, bu nedenle güncelleme işlemi sırasında tüm sıralı güncelleme kancaları yürütülür.
    • Bu işlevi kurulum dosyasının dışında kullanmak için, önce Drupal'ı install.incve modülün kurulum dosyasını, örn.

      require_once DRUPAL_ROOT . '/includes/install.inc';
      module_load_include('install', 'foo');
    • ini_set('max_execution_time', 0);PHP zaman aşımlarını önlemek için daha uzun yükleme güncellemeleri eklemeyi düşünün .
  3. Kullanma drush. Aşağıda birkaç örnek bulabilirsiniz:

    • drush eval 'module_load_include('install', 'foo'); $s = []; foo_update_7001($s);'
    • drush sqlq "UPDATE system SET schema_version = 7000 WHERE name = 'foo'" && drush -y updb

1
Ah güzel, bilmiyordum drupal_set_installed_schema_version(). Bu güncelleme kancaları hata ayıklamak için süper kullanışlı olurdu!
coredumperror

1
Yani içine koymak ana sorun hook_install()uzun toplu (korumalı) güncellemeleri çalıştırmaktır. İdeal durumda, update.phpzaman aşımlarını önlemek için PHP iş parçacığının yeniden başlatılmasıyla aynı şekilde güncellemeleri tetiklemenin bir yolu olmalıdır . Karınca fikirleri nasıl yapılır?
Alex Skrypnyk

@ Alex.Designworks ini_set('max_execution_time', 0);Güncellemeleri tetiklemeden önce ekleyebilirsiniz .
kenorb

1

(Cevaba dönüştü)

Bir güncellemenin yapılıp yapılmadığını saptamak için "schema_version FROM sistemini SEÇ" yapabilirsiniz. Değilse, çalıştırmayı reddedin (bir hata mesajı ile).


Lütfen yanıtınızı yeniden yazın ve bir kullanım örneği vermeye çalışın.
Елин Й.

Bu yorumu yoksay.
coredumperror

Söz konusu işlevsellik başka bir modül için bir eklenti olduğu için bunun işe yaramayacağından korkuyorum ve bu modülün kullanıcıların ithalatçılarıyla uğraşmasına izin vermesini engelleyemiyorum.
coredumperror

Güncellemeler için izlemek istediğiniz modülün şema sürümünü kontrol edemiyor musunuz?
user18099

0

Yukarıdaki önerileri kabul ediyorum - tek eklediğim "Tetikleyiciler ve İşlemler" i de araştırmak olacaktır - bir tetikleyici (kullanıcı yönetici sayfasını kontrol eder, vb.) . Kullanım örnekleri için Örnekler modülüne bakın, hem eylem hem de tetikleyici örnek kodu vardır. :)


0

function MYMODULE_install() { $functions = get_defined_functions(); foreach ($functions['user'] as $function) { if (strpos($function, 'MYMODULE_update_') === 0) { call_user_func($function); } } }

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.