Kancalarım Drupal tarafından çağrılmadı


9

Bir modül geliştiriyorum, ancak eklediğim kancalar Drupal'dan çağrılmıyor. Birden fazla kanca ile olur.

Kancaların belgelerini okudum ve bunun neden olduğunu açıklayacak hiçbir şey bulamıyorum. Doğru parametreleri kullandığımı ve doğru değeri döndürdüğümü doğruladım.

Neyi yanlış yapıyorum? Kaçırdığım bir şey var mı?


Bu soru, Drupal tarafından çağrılmayan kancalarla ilgili sorular için kanonik bir soru olarak düşünülmektedir.
kiamlaluno

Yanıtlar:


13

Bir modül geliştirirken aşağıdaki notları aklınızda bulundurmalısınız.

  • Bir modülden yapılan bir kancanın uygulanması, modülün kısa adıyla ( makine adı da denir) adının önüne gelen bir işlevdir ; kanca adından kanca parçasını çıkarın ve modül makine adıyla değiştirin. Örneğin, hook_menu()example.module ile yapılan uygulama example_menu(). Modül example_menu.module ise ve işlev ise example_menu(), hook_menu()example_menu.module uygulaması olarak değerlendirilmez.
    Bu aynı zamanda, örneğin hook_form_alter()example_form.module içindeki uygulamanın değil example_form_alter(), olduğu anlamına gelir example_form_form_alter(). Başka bir örnek olarak, example.module öğesinden hook_form_FORM_ID_alter()döndürülen formu değiştirmek için yapılan user_register_form()işlemin uygulanması değil example_form_user_register_alter(),example_form_user_register_form_alter(). (Form kimliği user_register_form şeklindedir .)

  • Genellikle sorunları yaratmaz modül makine adına büyük karakterleri kullanarak, konuşma: PHP arasındaki farkları yapmaz myModule_get_value()ve mymodule_get_value()ve $value = myModule_get_value()ya çağırır myModule_get_value()veya mymodule_get_value().
    Bununla birlikte, bir modül makine adında büyük harfli karakterlerin kullanılmasının sorunlara neden olacağı bir durum vardır: bir modül için güncelleme kancalarını tanımlarken. drupal_get_schema_versions()kullanılabilir güncelleştirmelerin listesini döndüren işlev aşağıdaki kodu içerir.

    // Prepare regular expression to match all possible defined hook_update_N().
    $regexp = '/^(?P<module>.+)_update_(?P<version>\d+)$/';
    $functions = get_defined_functions();
    // Narrow this down to functions ending with an integer, since all
    // hook_update_N() functions end this way, and there are other
    // possible functions which match '_update_'. We use preg_grep() here
    // instead of foreaching through all defined functions, since the loop
    // through all PHP functions can take significant page execution time
    // and this function is called on every administrative page via
    // system_requirements().
    foreach (preg_grep('/_\d+$/', $functions['user']) as $function) {
      // If this function is a module update function, add it to the list of
      // module updates.
      if (preg_match($regexp, $function, $matches)) {
        $updates[$matches['module']][] = $matches['version'];
      }
    }

    En son yürütülen satır drupal_get_schema_versions()aşağıdaki satırdır .

    return empty($updates[$module]) ? FALSE : $updates[$module];

    Modül adı myModule.module ise, drupal_get_schema_versions('myModule')yalnızca myModule_update ile başlayan ve bir sayı ile biten işlevleri döndürür; mymodule_update_7120()kullanılan normal ifade drupal_get_schema_versions()büyük / küçük harfe duyarlı olduğu için gibi işlevler dahil edilmez . Düzenli ifade hala Drupal 7'de kullanılanla aynı olduğundan, bu durum Drupal 8 için de geçerlidir.

  • Bazı kancalar belirli anlarda çağrılır. Örneğin hook_menu(), ve hook_menu_alter()bir modül etkinleştirildikten / devre dışı bırakıldıktan sonra veya yönlendirici bilgisi önbelleği temizlendikten sonra Drupal 7'den çağrılır; hook_init()önbelleğe alınmış sayfalar için çağrılmaz.
    Belirli bir olay gerçekleştiği için kancalar çağrıldığında, benzer bir olay gerçekleşmedikçe tekrar çağrılmazlar. Bunlar birbirini izleyen iki sayfa isteğinde çağrılmaz.

  • Drupal, bir modülden uygulanan kanca listesini önbelleğe alır. Yeni kanca eklemek için etkin bir modülün kodunu düzenliyorsanız, önce modülü devre dışı bırakıp yeniden etkinleştirmeniz gerekir, aksi takdirde Drupal yeni kancalar olduğunu fark etmez.

  • Bir returnifadenin yeniden düzenleme sırasında kanca işlevlerinizden birine gizlice girmediğinden emin olun . Sadece göründüğü kancayı kırmakla kalmaz, aynı zamanda diğer kancaları da kıran ve problemin bulunmasını zorlaştıran bir zincirleme reaksiyona neden olma potansiyeline sahiptir.


Ayrıca gelecekte başkaları uğruna benim hatam bahsetmeye değer: .module (veya herhangi bir "düz", sınıf dışı PHP) dosyasında bir ad alanı tanımlamayın. Aksi takdirde Drupal dosyanızı tanımaz, bu nedenle içinde tanımlanan kancaları keşfetmez.
Balu Ertl
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.