Tema kancaları ve modül kancaları


10

Bazen bir kanca uygulamaya çalıştığımda, sadece bir modül dosyasında olması gerektiğini fark etmek için.

Bir temanın template.php dosyasında veya bir modülde hangi kancaların uygulanabileceğini bilmenin bir yolu var mı?


4
Genellikle bir kanca bir temada geçersiz kılınamazsa bunun iyi bir nedeni vardır. Temalar yalnızca modüllerin sağladığı içerik ve işlevsellik ile ilgili kodlar için olmalıdır. İşlev veya içerik ekleyen / kaldıran / değiştiren kod genellikle bir modülde olmalıdır. Ayrıca, temaları değiştirirseniz, template.php'de yapılan herhangi bir özelleştirmeyi kaybedeceğinizi düşünün, bu nedenle, temaları değiştirdiyseniz saklamak isteyebileceğiniz değişiklikler yaparsanız, bu kesinlikle bir modüle gitmek isteyecektir.
rooby

Yanıtlar:


11

Genel olarak, yalnızca öteki kanca temalar ile uygulanabileceği gibi araçlar kanca hook_form_alter()ve hook_menu_alter()veya kısaca üzerinden çağrılan tüm bu kanca drupal_alter()Drupal 7 ve alt ( ModuleHandler()::alter()veya ThemeManager::alter()Drupal 8).

module_invoke_all()( ModuleHandler::invokeAll()Drupal 8'de) tarafından çağrılan diğer kancalar, temalar için çağrılmaz, çünkü kod şu anda etkin olan temanın herhangi bir kanca tanımlayıp tanımlamadığını kontrol etmez.

  foreach (module_implements($hook) as $module) {
    $function = $module . '_' . $hook;
    if (function_exists($function)) {
      $result = call_user_func_array($function, $args);
      if (isset($result) && is_array($result)) {
        $return = array_merge_recursive($return, $result);
      }
      elseif (isset($result)) {
        $return[] = $result;
      }
    }
  }

ModuleHandlerSınıfın modüllerden uygulanan kancaları çağırdığı Drupal 8'de, sınıf ThemeManagertemalar tarafından uygulanan kancaları çağırır, sadece birinci sınıf uygular invoke()ve invokeAll(). Bu, Drupal 8'de tema kancalarının Drupal çekirdeği tarafından çağrılmadığı anlamına gelir.

Bu, Drupal göbek kancaları ve çoğunlukla üçüncü taraf modüller tarafından kullanılan tüm kancalar için geçerlidir. Bu durumda bir kancanın bir tema tarafından da uygulandığını doğrulamak ve çağırmak bir modüle bağlıdır. Views modülü bunu yapar.

  // Let modules modify the view just prior to rendering it.
  foreach (module_implements('views_pre_render') as $module) {
    $function = $module . '_views_pre_render';
    $function($this);
  }

  // Let the themes play too, because pre render is a very themey thing.
  foreach ($GLOBALS['base_theme_info'] as $base) {
    $function = $base->name . '_views_pre_render';
    if (function_exists($function)) {
      $function($this);
    }
  }
  $function = $GLOBALS['theme'] . '_views_pre_render';
  if (function_exists($function)) {
    $function($this);
  }

Üçüncü taraf modüller tarafından kullanılan kancalar için, onları çağırmak için kullanılan kodu kontrol etmeniz gerekir. Şanslar, temalar için sadece değişiklik kancalarının çağrılmasıdır, ancak bazı durumlarda temalar tarafından başka kancalar da uygulanabilir.
Temalar söz konusu olduğunda, tüm etkin temaların modüllerle olanlardan farklı olarak kanca uygulamaları için denetlenmediğini unutmayın. Views modülünden yapıldığı gibi yalnızca şu anda kullanılan tema ve temel temalar kontrol edilir.


hook_entity_view_alter () temalarda çalışmıyor.
dxvargas

En azından D7'de temalardaki alternatif kancalar sadece tema zaten aynı istekte (yani çağrılarak theme()) başlatılmışsa çağrılır . Başlatılmamışsa, herhangi bir temada herhangi bir değiştirme kancası çalıştırılmaz.
zwirbeltier

@zwirbeltier Sayfayı oluşturmak için kullanılan tema için tema kancaları çağrılır. theme()sayfa için kullanılan temayı değiştirmez, ancak veri oluşturma işlevini çağırır. Temayı değiştirmez, örneğin, Garland'dan Minelli'ye.
kiamlaluno

@kiamlaluno: İçinizdeki koda bakarsanız, daha önce çağrılmışsa drupal_alter()temada sadece alter-hook drupal_theme_initialize()çağrıldığını görürsünüz . Değilse o zaman aktif bir tema (henüz) yoktur ve bu nedenle kanca çağrılmaz. En azından D7'de drupal_theme_initialize(), bir talepte ilk kez çağrıldığında bir garanti yoktur .
zwirbeltier

@zwirbeltier Drupal'dan ayarlanan tema, bir sayfa oluşturulduğunda zaten başlatıldı. Bir modül, uygun işlevi çağırmadan sayfa için bir tema ayarlarsa, onu başlatmak onun sorumluluğundadır.
kiamlaluno
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.