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ı?
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ı?
Yanıtlar:
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;
}
}
}
ModuleHandler
Sınıfın modüllerden uygulanan kancaları çağırdığı Drupal 8'de, sınıf ThemeManager
temalar 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.
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.
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.
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 .