Manchmal, wenn ich versuche, einen Hook anzuwenden, nur um zu erkennen, dass er sich in einer Moduldatei befinden soll.
Gibt es eine Möglichkeit zu wissen, welche Hooks in der template.php-Datei eines Themas oder in einem Modul implementiert werden können?
Antworten:
Im Allgemeinen können nur Änderungs-Hooks durch Themen implementiert werden, dh Hooks wie
hook_form_alter()
undhook_menu_alter()
oder kurz alle Hooks, diedrupal_alter()
in Drupal 7 und niedriger (ModuleHandler()::alter()
oderThemeManager::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.In Drupal 8, wo die
ModuleHandler
Klasse aus Modulen implementierte Hooks aufruft und dieThemeManager
Klasse durch Themen implementierte Hooks aufruft, implementiert nur die erste Klasseinvoke()
undinvokeAll()
. 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.
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.
quelle
theme()
). Wenn es nicht initialisiert wurde, werden keine Änderungs-Hooks in einem Thema ausgeführt.theme()
ändert das für die Seite verwendete Thema nicht, ruft jedoch eine Funktion zum Rendern von Daten auf. Das Thema ändert sich beispielsweise nicht von Garland zu Minelli.drupal_alter()
ansehen, sehen Sie, dass er nur dann Alter-Hooks im Thema aufruft, wenndrupal_theme_initialize()
er zuvor aufgerufen wurde. Wenn dies nicht der Fall wäre, gibt es (noch) kein aktives Thema und daher werden keine Hooks aufgerufen. Zumindest in D7 gibt es keine Garantie, wenndrupal_theme_initialize()
das erste Mal in einer Anfrage aufgerufen wird.