System von Hooks
Einführung
Hooks sind eine Funktion für Entwickler, die es ihnen ermöglicht, benutzerdefinierten Code zu Standard-Dolibarr-Seiten hinzuzufügen, ohne Dolibarr-Kerndateien ändern zu müssen. Im Gegensatz zum System of Triggers (eine andere Möglichkeit, mit Dolibarr-Code zu interagieren), die mit Dolibarr-Ereignissen verknüpft sind, können Hooks überall und jederzeit ausgeführt werden, solange sie im Dolibarr-Kern geplant wurden. Dies sind Einfügepunkte im Programm. Hooks sind abhängig von einem Kontext aktiv oder nicht (häufig ein Kontext pro Modul: zum Beispiel „productcard“ für Produkte, „invoicecard“ für Rechnungen...). Um vorhandene Hooks zu finden, suchen Sie nach " initHooks( " Hooks sind Funktionen, die Standardcode einfügen oder ersetzen. Um Code zu finden, der überschrieben werden kann, suchen Sie nach " executeHooks( ". Fügen Sie einen Haken hinzu, um das Einfügen von Code zu ermöglichen
Um einen Hook in Ihr eigenes Modul zu implementieren (damit Ihr Modul von anderen "gehakt" werden kann) müssen Sie 2 Schritte ausführen. Diese Schritte müssen für jedes PHP-Skript in Ihrem Modul wiederholt werden, in dem Sie Hooks implementieren möchten.
1- Initialisieren Sie das HookManager-Objekt (platzieren Sie dieses Codestück am Anfang Ihres PHP-Skripts, direkt nach oder vor den Includes):
// Technisches Objekt initialisieren, um Hooks von Drittanbietern zu verwalten. Beachten Sie, dass '''conf->hooks_modules''' das Array array
include_once ( DOL_DOCUMENT_ROOT . '/core/class/hookmanager.class.php' );
$hookmanager = neuer HookManager ( $db );
$hookmanager -> initHooks ( array ( 'context' ));
$hookmanager->initHooks() akzeptiert 1 Parameter (ein Array von Kontexten) und aktiviert die Hook-Unterstützung für dieses Skript: - ' context' ist die Zeichenfolge, die den Ausführungskontext enthält. Dies ist ein einfaches Flag, das von Hook-Funktionen verwendet werden kann, um zu erkennen, wann sie aufgerufen werden (mehrere Seiten/Module können denselben Hook an verschiedenen Stellen aufrufen, und eine Hook-Funktion möchte möglicherweise nur für einen bestimmten Kontext ausgeführt werden und nicht für die anderen). . Hinweis: Sie können mehrere Kontexte gleichzeitig festlegen (z. B. wenn Sie einen gemeinsamen Kontext für mehrere Seiten benötigen, aber auch einen spezifischen Kontext für eine bestimmte Seite wünschen).
2- Platzieren Sie dann den Aufruf der Hooks dort, wo Code hinzugefügt werden soll:
$parameters=array();
$reshook=$hookmanager->executeHooks('hookname',$parameters,$object,$action); // See description below
// Note that $action and $object may have been modified by hook
if (empty($reshook))
{
... // standard code that can be disabled/replaced by hook if return code > 0.
}
'hookmanager->executeHooks()' akzeptiert 4 Parameter und fügt einen Hook hinzu (das ist ein Einstiegspunkt in Ihr Skript für Funktionen, die außerhalb Ihres Skripts und Moduls liegen):
- 'Hookname' ist der Name der Methode, die aufgerufen wird. Zum Beispiel: 'formObjectOptions'.
- '$parameters' ist ein benutzerdefiniertes Array, um mehr benutzerdefinierte Daten an den Hook zu übermitteln (die Funktion im Hook kann diese Daten verarbeiten). Platzieren Sie hier, was Sie wollen, es kann eine Datei, ein Array mit Zeichenketten oder etwas anderes sein. Zum Beispiel:
$parameters=array('file'=>'my/path/to/a/file', 'customnames'=>array('henry','david','john'));
- $object ist das Objekt, das Sie der Hook-Funktion übergeben wollen, sicherlich die Daten des aktuellen Moduls (z. B. das Rechnungsobjekt, wenn Sie sich in einem Rechnungsmodul befinden, usw.). Es kann alles Mögliche sein, aber denken Sie daran, dass es die Hauptkomponente ist, die von den Hook-Funktionen verwendet wird.
- $action ist ein String, der die aktuelle Aktion angibt (kann null sein oder etwas, das wie "create" oder "edit" aussieht).
Hinweis: Sie müssen diesen Schritt mehrmals wiederholen, wenn Sie mehrere Hooks an verschiedenen Stellen Ihres Skripts einfügen wollen.
Nun sollte Ihr Modul gehookt werden können. Sie können die unten unter Hook implementieren beschriebene Vorgehensweise befolgen, um eine Hook-Funktion zu implementieren, die den Vorteil dieser Funktion nutzt (Sie können auch testen, ob es funktioniert).
Einen Hook implementieren
Um einen Hook zu verwenden (also einen Teil des Codes hinzuzufügen oder zu überschreiben), müssen Sie zunächst einen Moduldeskriptor definiert haben (siehe Modul_Entwicklung#Modul_Deskriptor_erstellen_(erforderlich) dafür). Anschließend müssen Sie die folgenden Schritte durchführen:
1. Fügen Sie Ihr Modul dem Kontext hinzu, in dem der Hook ausgeführt werden soll. Das heißt, wenn man sich in dem gegebenen Kontext befindet, wird Ihr Code aufgerufen. Bearbeiten Sie dazu den Deskriptor Ihres Moduls (/htdocs/yourmodulename/core/modules/modYourModuleName.class.php) und füllen Sie die Variable $this->module_parts wie im Beispiel :
$this->module_parts = array(
'hooks' => array('hookcontext1','hookcontext2') // Set here all hooks context you want to support
);
Anmerkung: Sie können den Kontext eines Moduls auch finden, indem Sie Folgendes hinzufügen
print('Module context: '.$object->context);
(Fügen Sie diesen Code in die php-Datei ein, in der die Hooks aufgerufen werden, und löschen Sie ihn wieder, sobald der Wert des Kontexts ermittelt wurde).
Achtung: Vergessen Sie nicht, Ihr Modul in der Modulverwaltung zu deaktivieren und dann wieder zu aktivieren, damit die Änderung wirksam wird, denn die Speicherung der zu verwaltenden "Modul-Hooks"-Paare erfolgt in der Datenbank, die erst bei der Aktivierung des Moduls aktualisiert wird.