Im Allgemeinen können nur Änderungs-Hooks durch Themen implementiert werden, dh Hooks wie hook_form_alter()
und hook_menu_alter()
oder kurz alle Hooks, die drupal_alter()
in Drupal 7 und niedriger ( ModuleHandler()::alter()
oder ThemeManager::alter()
in Drupal 8) aufgerufen werden .
Andere Hooks, die von module_invoke_all()
( ModuleHandler::invokeAll()
in Drupal 8) aufgerufen werden , werden nicht für Themen aufgerufen, nur weil der Code nicht prüft, ob das aktuell aktivierte Thema einen Haken definiert.
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;
}
}
}
In Drupal 8, wo die ModuleHandler
Klasse aus Modulen implementierte Hooks aufruft und die ThemeManager
Klasse durch Themen implementierte Hooks aufruft, implementiert nur die erste Klasse invoke()
und invokeAll()
. Dies bedeutet, dass in Drupal 8 keine Themen-Hooks vom Drupal-Kern aufgerufen werden.
Dies gilt für Drupal-Core-Hooks und hauptsächlich für alle Hooks, die von Modulen von Drittanbietern verwendet werden. Es liegt dann an einem Modul, zu überprüfen, ob ein Hook auch von einem Thema implementiert wird, und ihn aufzurufen. Dies ist, was das Views-Modul tut.
// 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);
}
Bei Hooks, die von Modulen von Drittanbietern verwendet werden, müssen Sie den Code überprüfen, mit dem sie aufgerufen werden. Es besteht die Möglichkeit, dass für Themen nur Änderungs-Hooks aufgerufen werden. In einigen Fällen können jedoch auch andere Hooks von Themen implementiert werden.
Beachten Sie, dass bei Themen nicht alle aktivierten Themen auf Hook-Implementierungen überprüft werden, im Gegensatz zu Modulen. Nur das aktuell verwendete Thema und die Basisthemen werden wie im Modul Ansichten überprüft.