logo

Extra Block Types (EBT) - Neue Erfahrung im Layout Builder❗

Extra Block Types (EBT) - gestylte, anpassbare Blocktypen: Diashows, Registerkarten, Karten, Akkordeons und viele andere. Eingebaute Einstellungen für Hintergrund, DOM Box, Javascript Plugins. Erleben Sie die Zukunft der Layouterstellung schon heute.

Demo EBT-Module EBT-Module herunterladen

❗Extra Absatztypen (EPT) - Erfahrung mit neuen Absätzen

Extra Paragraph Types (EPT) - analoger, auf Absätzen basierender Satz von Modulen.

Demo EPT-Module EPT-Module herunterladen

Scroll

9.2. Was bedeutet „Hook“ in Drupal?

27/05/2025, by Ivan

Dieser Artikel soll Ihnen Drupal näherbringen, wir werden später Codebeispiele schreiben, nachdem wir unser eigenes Modul hinzugefügt haben.

Drupal ist kein monolithisches System, in dem alles perfekt ist und nichts geändert werden muss. Sehr oft werden Kunden gebeten, dieser oder jener Website eine Funktion hinzuzufügen. Um den Drupal-Core-Code pflegen und gleichzeitig Funktionalität zu erweitern zu können, verwenden wir Module. Das modulare System ermöglicht es, die Fähigkeiten von Drupal zu erweitern. Aber was, wenn wir die Fähigkeiten eines fertigen Zählermoduls erweitern müssen? Natürlich können wir eine Anfrage zur Erweiterung der benötigten Funktionalität auf drupal.org stellen und vielleicht bekommen wir nach einem Monat, zwei … einem Jahr oder zwei die benötigte Funktion in einem bestimmten Modul. Aber wir können auch anders handeln und den benötigten Code selbst schreiben. Um die Fähigkeiten zusätzlicher Drupal-Module sowie von Drupal selbst zu erweitern, verwenden wir Hooks und Plugins in unseren eigenen Modulen.

Die Hauptidee ist, dass wir den Drupal-Code, den Code zusätzlicher Module nicht anpassen müssen, und dadurch sparen wir viel Arbeit des Programmierers. Um den Code der Module und Drupal einfach aktualisieren zu können, darf man keine Änderungen am Drupal-Core oder an Fremdmodulen vornehmen. Andernfalls werden alle Änderungen beim nächsten Update des Moduls oder des Drupal-Cores überschrieben.

Für die Verbindung zwischen Modulen und Drupal-Core sowie zwischen Modulen untereinander gibt es in Drupal ein Hook-System. Ein Hook ist ein Callback einer Funktion, das heißt, wenn der Code an einem Hook ausgeführt wird, wird unser eigener Funktionscode, den wir in unserem Modul hinzufügen, mit ausgeführt. So können wir Nutzerdaten, Menüs, Taxonomien, Nodes verschiedener Inhaltstypen jederzeit beim Ändern, Hinzufügen, Löschen oder auch nur beim Laden und Anzeigen bearbeiten. Es gibt viele Hooks für Drupal 8, aber weniger als in Drupal 7, weil viele Hooks über externe Symfony-Komponenten realisiert wurden:

https://api.drupal.org/api/drupal/core%21core.api.php/group/hooks/8.2.x

Wenn Sie sich die Liste für Drupal 7 ansehen, müssen Sie viel länger scrollen:

https://api.drupal.org/api/drupal/includes%21module.inc/group/hooks/7.x

Das heißt aber nicht, dass Drupal 8 weniger leistungsfähig ist, nur dass alles, was in Drupal 7 als Hook implementiert wurde, in Drupal 8 über passende Plugins ergänzt wird.

Wenn Sie sich die Liste der Hooks in Drupal 8 genau ansehen, erkennen Sie bei vielen den Suffix _alter, was bedeutet, dass dieser Hook dafür gedacht ist, Werte von Variablen zu ändern, zum Beispiel:

hook_form_alter() – erlaubt es, das Formular-Array während der Verarbeitung in Drupal zu verändern. Später analysieren wir, wie Formulare in Drupal aus Arrays generiert werden. Um diesen Hook in einem Modul zu verwenden, schreiben wir einfach eine Funktion, wie bei anderen Hooks auch:

function mymodule_form_alter() {
  // Formular-Array ändern
}

Ich habe das Beispiel vereinfacht und die Argumente der Funktion sowie Namespaces weggelassen. Wir wollen jetzt nur verstehen, wie Hooks funktionieren. mymodule ist unser Modulname, wir ersetzen das Wort hook durch den Namen unseres Moduls und die Funktion wird automatisch erkannt und modifiziert die Formular-Arrays. Wie funktioniert das? In der Methode prepareForm wird eine weitere Methode alter() aufgerufen:

$this->moduleHandler->alter($hooks, $form, $form_state, $form_id);

Das bedeutet, dass jedes Modul in Drupal, das hook_form_alter() implementiert, seinen eigenen Code an dieser Stelle einfügt. Wenn wir also Code an einer Stelle in Drupal hinzufügen wollen, sollten wir zuerst Hooks verwenden, dann Plugins, und falls es absolut unmöglich ist, das Plugin-Modul nicht zu ändern, dann patchen/hacken/ändern wir das Modul (leider ist das manchmal notwendig). Bisher sind wir noch nicht auf Aufgaben gestoßen, die Änderungen an Plugins erfordern, also lernen wir nun, wie man eigene Module schreibt.