Die anderen Antworten sind großartig, genau und detailliert, aber ich bin mir nicht sicher, ob sie die "einfachen Worte" sind, die die nackten Knochen des Konzepts erklären, nach dem der Fragesteller gesucht hat.
Ich stelle mir Hooks als einen Punkt vor, an dem der Code pausiert und " Hat noch jemand hier etwas hinzuzufügen? " Jedes Modul kann eine Funktion haben, die darauf antwortet und mit den entsprechenden Daten ausgelöst wird, die an dieser Stelle im Code an das Modul übergeben werden.
Ein schönes einfaches Beispiel ist hook_node_delete () . Jedes Modul kann es verwenden, um Dinge jedes Mal zu ermöglichen, wenn ein Knoten gelöscht wird. Die Dokumentation teilt Ihnen mit, dass dieser Hook dem Modul das Objekt des gelöschten Knotens übergibt, mit dem es arbeiten soll, und enthält weitere nützliche Informationen, z. B. über den genauen Zeitpunkt des Aufrufs (z. B. bevor die Knotendaten tatsächlich aus der Datenbank gelöscht werden). , und wo in Drupals Code der Hook aufgerufen wird (das kann mehr als eine Stelle sein).
Sie können untersuchen, welche Hooks vorhanden sind, und herausfinden, welche Daten an sie übergeben werden, indem Sie in der Drupal-API Dinge untersuchen, die mit "hook_" beginnen .
Hooks funktionieren nach Namenskonventionen: In hook_node_delete
unserem Beispiel, wenn der Knotenlöschprozess den Punkt erreicht, an dem der Hook aufgerufen wird, wird für jedes Modul mit einer Funktion wie dieser [modulename]_node_delete()
das Wort hook im Hook-Namen durch den Namen des Moduls ersetzt (z. B. my_amazing_module_node_delete()
) werden diese Funktionen aufgerufen.
Warum? Jedes Modul kann also an diesen wichtigen Punkten alles tun: Beispielsweise können Sie den gelöschten Knoten anzeigen und Aktionen ausführen, wenn eine bestimmte Bedingung erfüllt ist (z. B. E-Mail an einen Administrator senden oder einen längeren Prozess starten).
Mit einigen Hooks können Sie Dinge ändern, die unmittelbar vor ihrer Verarbeitung generiert wurden. Beispiel: hook_menu_alter () übergibt Ihnen die aktuellen Menüelemente , die das System generiert hat. Jedes Modul kann eine Funktion some_modulename_menu_alter () definieren und diese anzeigen, optional ändern (einige löschen, einige hinzufügen, sortieren ...) und das neu geänderte Menü zurückgeben.
Es ist einfach, sehr leistungsstark und bildet den Kern der Funktionsweise von Drupal als modulares System. Die Implementierung von Hooks ist das Herzstück der meisten Drupal-Module.
Wenn Sie den Code eines Drupal-Moduls durchsehen, können Sie feststellen, welche Funktionen von Hooks stammen (im Gegensatz zu Funktionen, die einfach aus dem Modulcode selbst aufgerufen werden), da die Drupal-Community eine Konvention erzwingt, bei der jede Implementierung eines Hooks eine hat Kommentar davor wie folgt (beachte das Bit "Implements hook _..."):
/**
* Implements hook_some_hook().
*
* Some descriptive summary of what this does
*/
function my_amazing_module_some_hook() {
Einige Module, die als APIs fungieren, definieren ihre eigenen Hooks. Beispielsweise definiert Views viele Hooks, mit denen Sie Daten an verschiedenen Stellen beim Erstellen oder Anzeigen einer View hinzufügen, lesen und bearbeiten können. Informationen zu Hooks, die in benutzerdefinierten Modulen erstellt wurden, finden Sie an zwei Stellen (vorausgesetzt, das Modul folgt Konventionen usw.):
Bootstrapping ist, wie andere erklärt haben, im Grunde genommen ein Hochfahren - ich werde die anderen guten, klaren Erklärungen nicht wiederholen.
Für Laien sind Hooks eine Art Brücke, über die Module miteinander interagieren, die Struktur und Daten des anderen ändern, neue Daten bereitstellen usw.
In den meisten Fällen wird das Wort
hook_
in Funktionsnamen durch den Namen Ihres Moduls ersetzt. Auf diese Weise kann Ihr Modul den Betrieb eines anderen Moduls nutzen. Zum Beispiel ruft ein Drupal-Kernmodul namens "node" verschiedene Hooks auf. Eine davon wirdhook_node_update
jedes Mal aufgerufen, wenn ein vorhandener Knoten aktualisiert wird. Wenn dieser Hook aufgerufen wird, wird diemymodule
Implementierung Ihres Moduls (sagen wir, wir nennen es )hook_node_update
aufgerufen. In diesem Fall handelt es sich um eine Funktion in der .module-Dateimymodule_node_update
Ihres Moduls es ist auch in der .module-Datei enthalten). Diesem Hook werden auch die notwendigen Parameter (Variablen) übergeben, die er verwenden, ändern und / oder zu der Funktion zurückkehren kann, die den Hook aufgerufen hat.Als ich anfing, Drupal zu lernen, saß ich im selben Boot wie Sie, es ist anfangs etwas schwierig zu verstehen, aber sobald Sie es verstanden haben, ist es so einfach und intuitiv. Viel Glück.
quelle
Einer der Kernentwickler hat vor einiger Zeit einen Artikel mit dem Titel "Drupal-Programmierung aus einer objektorientierten Perspektive" verfasst . Es ist gut zu erklären, wie Hooks als Implementierung vieler gängiger Entwurfsmuster angesehen werden können . Die beste Erklärung für Haken stammt aus dem Artikel:
quelle
Der Bootstrap ist der Prozess, den Drupal durchläuft, um eine Seite zu erstellen, die im Grunde den gesamten Kern-, Design- und Modulcode in der richtigen Reihenfolge durchläuft.
Im Grunde bootet Drupal und bereitet sich darauf vor, seine Arbeit als CMS zu erledigen.
Es ist insofern clever, als es uns ermöglicht, Hooks an einer beliebigen Stelle in unseren Modulen und Themes zu platzieren, und der Bootstrap-Prozess stellt sicher, dass sie zum richtigen Zeitpunkt ausgeführt werden.
Wenn Sie zum Beispiel 'hook_form_alter' verwenden, um einem Formular ein benutzerdefiniertes Kontrollkästchen hinzuzufügen, stellt Drupals Bootstrap sicher, dass dieser Code ausgeführt wird, kurz bevor es Ihr Formular rendert.
Ein Problem mit dem Bootstrap ist, dass der gesamte Prozess einige Zeit in Anspruch nimmt, selbst wenn Sie nur eine kleine Datenmenge zurückgeben. Wenn Sie Drupal mit dem Services-Modul als API verwenden und viele kleine XHTML- oder JSON-Antworten zurückgeben, ist die Ausführung des gesamten Bootstraps nicht sehr performant. Einige clevere Leute suchen nach Wegen, um dies für Drupal 8 zu umgehen.
Für das Rendern normaler Drupal-Seiten funktioniert der Bootstrap-Prozess jedoch hervorragend. Er verwendet das Drupals-Caching-System, um die Dinge zu beschleunigen, und gibt Ihnen die vollständige Kontrolle über jeden Teil Ihrer Website. Wenn Sie feststellen, dass Ihre Site langsam ist, können Sie immer etwas wie APC oder MemCached verwenden, um die Geschwindigkeit zu erhöhen.
Ich hoffe, meine Antwort war richtig und erklärt die Dinge einfach für Sie, ich bin kein Experte, aber ich denke, dass es so funktioniert.
quelle
Bootstrap ist der Prozess, während dessen Drupal sich selbst initialisiert. Der Prozess umfasst tatsächlich:
$_SERVER
init_set()
Einige der Operationen, die ich beschrieben habe, sind spezifisch für Drupal 7 oder höher, aber die meisten Operationen sind unabhängig von der Drupal-Version.
Ein Hook ist eine PHP-Funktion, die bei Bedarf von Drupal oder Modulen von Drittanbietern aus aufgerufen werden kann, um eine Aufgabe auszuführen. Anstatt eine vorangestellte Liste mit aufzurufenden Funktionen zu haben, werden in der Liste die aktivierten Module und die von ihnen implementierten Funktionen überprüft.
Zum Beispiel verwendet Drupal
hook_node_update()
; Wenn ein Knoten mit node_save () gespeichert wird , wird der folgende Code ausgeführt.Was node_invoke () macht, ist das Folgende:
$node
als ParameterHooks können ihre eigenen Daten in einer Datenbank speichern oder den von einer Funktion zurückgegebenen Wert ändern. Der letzte Fall ist zum Beispiel, was mit hook_form_alter () passiert , was den Wert von
$form
übergeben als Referenz auf drupal_prepare_form () ändert .Drupal-Hooks werden im Allgemeinen mit drei Funktionen aufgerufen:
drupal_alter()
ist die Funktion, die zum Aufrufen bestimmter Hooks verwendet wird, deren Zweck darin besteht, die als Referenz übergebenen Daten zu ändern, z. B. hook_form_alter () , hook_hook_info_alter () und hook_tokens_alter () .Es gibt andere Funktionen, die zum Aufrufen von Hooks verwendet werden, wie z. B.
node_invoke()
, aber diese Funktionen verwenden im Wesentlichen eine der zuvor aufgeführten Funktionen.quelle
Haken sind pointcuts und
module_invoke_all
ist der Weber (leider sind wir in der Implementierung nicht klar und es gibt andere Webfunktionen). Nach meinem Kenntnisstand ist Drupal das einzige System, das AOP mit PHP-Funktionen implementiert .Weitere Informationen finden Sie unter Wie funktioniert AOP in Drupal?
quelle
Wenn Sie die Hooks sehen möchten, mit denen Drupal Sie anrufen kann, gehen Sie zu api.drupal.org , gehen Sie zum Suchfeld und geben Sie 'hook_' ein. Dies gibt Ihnen eine große Liste der meisten von Drupal definierten Hooks. Tun Sie dasselbe für '_alter' und sehen Sie noch mehr.
Die Seite Node API Hooks bietet eine chronologische Liste aller Hooks, die während der Knotenoperationen aufgerufen werden. Sie können sehen, wie sich das Knotenmodul und das Entity- und das Field-System beim Aufrufen von Hooks gegenseitig drehen.
Wenn Sie zum Beispiel nach unten scrollen und den Abschnitt nachsehen
node_load()
: Das Node-Modul gibt Ihnen ein hook_load () und übergibt dann die Steuerung an das Entitätssystem, das einige Felder lädt. Es gibt eine ganze Reihe von Feld-Hooks, die nicht aufgelistet sind, und wenn dies vorbei ist, ruft das Entity-System aufhook_entity_load()
, bevor die Kontrolle an den Node zurückgegeben wird, der sie aufrufthook_node_load()
.Dies gibt Ihrem Code die Möglichkeit, beim Laden Stück für Stück auf den betreffenden Knoten zu reagieren. Das Erlernen dieser Hooks und wann und warum sie aufgerufen werden, ist Teil des Abenteuers der Drupal-Codierung. :-)
Andere Systeme haben auch Haken. Wie
hook_init()
undhook_boot()
. Dies bringt Sie zum Bootstrap-Teil Ihrer Frage.hook_boot()
wird von Drupal aufgerufen, bevor das Caching-System geladen wurde. Wenn Ihr Modul also etwas tun muss, bevor Drupal wirklich gestartet ist, und Sie möchten, dass Ihr Code unabhängig vom Caching ausgeführt wird, müssen Sie dies implementierenhook_boot()
. Andernfalls würden Sie implementieren, wenn Sie sich nur für Seiten interessieren, die nicht zwischengespeichert sindhook_init()
.Dies gibt Ihnen die Möglichkeit, etwas früh im Ladevorgang zu implementieren, bevor Drupal vollständig gebootet wurde, und Ihnen gleichzeitig eine gewisse Flexibilität zu geben, an welcher Stelle des Prozesses Sie abfangen möchten.
Wenn Sie sicherstellen müssen, dass Drupal zu einem bestimmten Zeitpunkt gestartet wurde, bevor Sie fortfahren, können Sie anrufen
drupal_bootstrap()
. Wenn Sie sich zu dieser Dokumentation durchklicken, sehen Sie die verfügbaren Bootstrap-Stufen, von nichts bis zu allem.Schließlich können Sie im Beispielprojekt ausführlich dokumentierten Code für ein bestimmtes Subsystem sehen .
quelle
Hooks sind PHP-Funktionen, Bausteine, die auf den Namenskonventionen "yourmodulename_hookname" basieren. Sie sollen Entwicklern das Erstellen von Modulen erleichtern .
Module sind das einzig wahre, da sie sowohl CORE- als auch benutzerdefinierte Funktionen in Ihrem Drupal-System ermöglichen. Module bestehen also aus Hooks, und wenn ein Modul in Ihrer Drupal-Installation aktiviert ist, können seine Hook-Funktionen dank der module.inc-Funktion module_invoke_all ($ hook) oder module_invoke von anderen Modulen aufgerufen werden.
Um zu verstehen, was Haken sind, sollten Sie sich die Hände schmutzig machen und die Modulentwicklung ausprobieren. Beginnen Sie zu diesem Zweck mit dem Herunterladen und Testen einiger Drupal-Beispiele für Entwickler . Sie sollten sich auch mit der Modulerstellung vertraut machen .
Hier sind einige der nützlichen Drupal-Beispiele für die oben genannten Entwickler:
Implementierungsbeispiel für hook_block_view () im Modul block_example
Mit diesem Hook können Sie auf die Erstellung von Drupal-Blöcken zugreifen, um benutzerdefinierte Blöcke auf Ihrer Website anzuzeigen. Dies ist möglich, da das block.module eine _block_render_block-Funktion hat, mit der alle Module ihre hook_block-Ansicht definieren können (beachten Sie die letzte Zeile von module_invoke):
Implementierungsbeispiel für hook_menu () im Modul render_example
Dieser Hook ist mit dem URL-Routing-System von Drupal verknüpft und definiert URL-Muster mit zugehörigen Render-Rückrufen, die von Ihrem Modul verwendet werden. Es wird von system.module aufgerufen .
Grundsätzlich müssen Sie über den Bootstrap nur wissen, dass er bei jeder Seitenanforderung ausgeführt wird. Ich rate Ihnen wirklich, diese Stackoverflow-Antwort zu lesen . Sie erklärt, wie Bootstrap und Hooks zusammenhängen, aber voneinander getrennt sind.
In Bezug auf die Anzeige der Webseite wird die HTML-Anzeige der Drupal-Website hauptsächlich mit Render-Arrays und Theming erzielt .
quelle
Überall ein Modul ruft module_implements () http://api.drupal.org/api/drupal/includes%21module.inc/function/module_implements/7 Drupal werden alle korrekt genannten Funktionen in der richtigen Reihenfolge auf ihr Gewicht basierend abzufeuern. Diese werden als Hook-Funktionen bezeichnet, da in der Dokumentation für Module, die module_implements verwenden, Dinge wie hook_menu angezeigt werden (wenn das Menü alle Funktionen aufruft, die Menüelemente zurückgeben sollen). Das Wort "hook" muss nur durch den Namen des Moduls ersetzt werden, das es implementiert, und Drupal erledigt den Rest.
Es gibt auch eine drupal_alter () -Funktion, die alle korrekt benannten alter-Funktionen auslöst, mit der Absicht, Sie Dinge ändern zu lassen, die zuvor von einem anderen Hook registriert wurden.
Im Allgemeinen übergeben Änderungen Argumente als Referenz, sodass Sie das Objekt direkt bearbeiten können, wohingegen "normale" Hooks Sie normalerweise dazu bringen, neue Dinge zurückzugeben.
Die Idee ist, dass jedes Modul (einschließlich Ihres eigenen) einfach erweitert werden kann, indem Drupal aufgefordert wird, alle erforderlichen Hook-Funktionen aufzurufen und das zurückzugewinnen, was zur Verarbeitung zurückgegeben wird. Das Modul, das die Hook-Funktionen aufruft, muss nichts über die Module wissen, die die Hooks implementieren, und die Module, die den Hook implementieren, müssen nichts über das Modul wissen, das den Hook aufruft. Das einzige, was beide Module wissen müssen, ist die Struktur der zurückgegebenen oder geänderten Daten.
In der Praxis werden Haken üblicherweise verwendet, um:
quelle
Sie haben oben eine Menge Antworten, aber ich möchte eine Antwort auf viel einfachere Weise geben, um das grundlegende Konzept hinter Hooks zu verstehen. Hooks sind tatsächlich in Funktionen in Drupal Core integriert, um verschiedene Dinge zu verwalten und verschiedene Aufgaben in Core zu erledigen. Sie können Ihre eigenen Funktionen mit diesen integrierten Funktionen von Drupal Core synchronisieren, um ihre Funktionalität in Ihre eigenen Funktionen zu integrieren, indem Sie verschiedene Hooks aufrufen.
Ich hoffe, dass Sie den Punkt bekommen!
quelle
Für mich dreht sich alles um die Funktion module_implements, wenn es um Hooks und Core (D7) geht. Eine Sache, die ich für entscheidend halte, um zu verstehen, ist, dass Sie beim Schreiben eines Hakens zum Ändern von etwas keineswegs das letzte Wort darüber haben, was mit den Datenstrukturen geschieht, mit denen Sie es zu tun haben. Ihr Hook wird einfach in die Zeile (Warteschlange) von Funktionen eingereiht, die AUCH auf die gleichen Datenstrukturen einwirken, unabhängig davon, ob es sich um Menüs, menu_links, Blöcke, Knoten, Benutzer oder Entitäten oder Renderelemente handelt.
Um wirklich zu sehen, wie Ihre Haken in einer erwarteten Weise verwendet werden, müssen Sie wissen oder sich dessen bewusst sein, wo Sie (Ihr Haken) in der Schlange stehen. Dies wird durch das Gewicht Ihres Mondules bestimmt. Drupal Core ruft einfach die korrekt benannten Hooks in aufsteigender Gewichtsreihenfolge auf und was auch immer mit den Daten passiert, passiert.
Ich habe zuvor Hooks geschrieben, die keinen Effekt hatten, nur um nach stundenlangem Headbangen festzustellen, dass mein Modulgewicht zu leicht war und nachfolgende Hooks praktisch nicht das taten, was ich tat, oder alles zusammen ignorierten.
Ein gut geschriebener Hook wird sich nicht als "Mensch behandeln" oder "zwingen", der letzte zu sein, sondern wird "nett zu anderen" platziert, indem sichergestellt wird, dass sie die Datenstrukturen beibehalten, wie sie von den übrigen Hooks in der Folge erwartet werden.
Und wenn man von "The Line" der Haken spricht. Im Laufe der Jahre, in denen ich auf Google nach Drupal-Inhalten gesucht habe, scheint dieses Bild eine gute Darstellung der Vorverarbeitungs- und Prozess-Hook-Liste der Möglichkeiten zu sein.
quelle
Auf viel einfachere Weise helfen Hooks dem Entwickler, die vorhandene Funktionalität entsprechend den Anforderungen zu ändern, ohne Änderungen am vorhandenen Code vorzunehmen. Eher wie abstrakte Funktion in PHP.
Beispiel: Sie haben ein Modul zur Buchung eines Bustickets angelegt. Laut Ihrem Code kann der Abholort nicht bearbeitet werden, wenn das Ticket einmal gebucht wurde. Angenommen, Ihr Freund benötigt dasselbe Modul für ähnliche Anforderungen, mit der Ausnahme, dass der Benutzer den Abholort ändern kann. Irgendwie muss er Ihr Modul verwenden und Sie möchten nicht, dass er Codeänderungen vornimmt. Sie stellen also eine Schnittstelle (in unserem Fall Hook) zur Verfügung, über die er seine Änderungen implementieren kann, ohne Änderungen an Ihrem Modul vorzunehmen.
In Drupal bis Drupal-7 haben wir Hooks für Module sowie Themen. Um zu erfahren, wie Hooks funktionieren, klicken Sie auf drupal.org , um einen benutzerdefinierten Hook zu erstellen, und klicken Sie auf diesen Link
quelle
Haken. Ermöglichen Sie Modulen die Interaktion mit dem Drupal-Kern. Das Modulsystem von Drupal basiert auf dem Konzept der "Hooks". Ein Hook ist eine PHP-Funktion mit dem Namen foo_bar (), wobei "foo" der Name des Moduls (dessen Dateiname also foo.module lautet) und "bar" der Name des Hooks ist.
quelle