Können Sie Ihren eigenen Hook in Drupal erstellen?
Lesezeit: 5 Minuten
Alan Sturm
Ist es möglich zu erstellen dein eigenes Haken Sie ein Drupal-Modul ein, damit andere Drupal-Module es verwenden können? Wenn nicht, gibt es in Drupal einen Mechanismus für Drittentwickler, um Hooks bereitzustellen? Wenn bisher alles ein Nein war, wo im Kern ist die Liste der Hooks implementiert?
So wie ich die Dinge verstehe, arbeiten Drupal-Module an einem Ereignis wie dem System namens Haken. Wenn Sie ein neues Modul erstellen, erstellen Sie Funktionen, die einen Hook implementieren. Da ist zum Beispiel ein hook_delete Haken. Wenn Sie eine Funktion in Ihrem Modul implementieren
function mymodule_delete($node)
{
}
Diese Funktion wird immer dann aufgerufen, wenn ein Knoten gelöscht wird.
Was ich wissen möchte, ist, gibt es eine Möglichkeit für mich als Entwickler von Drittanbietermodulen, zu erstellen mein eigenes Haken. Sagen Sie so etwas wie hook_alanskickbutthook damit andere Modulentwickler diesen Hook abonnieren können.
Wenn das möglich ist, wie machst du das? Ich habe mich in den offiziellen Dokumenten umgesehen und dort nicht viel gefunden, und mir wird immer noch ein wenig schwindelig, wenn ich anfange, im Drupal-Quellcode herumzustöbern (ich verstehe Rekursion, verbringe aber nicht genug Zeit damit, über rekursive Probleme nachzudenken). Vollständige Lösungen sind willkommen, aber ich freue mich, nur in die richtige Richtung gewiesen zu werden.
jps schlägt zurück
Module_invoke_all() ist Ihre Eintrittskarte zum Erstellen Ihrer eigenen Hooks:
Sobald Sie Ihren Hook erstellt haben, kann er in einem anderen Modul aufgerufen werden mit:
/**
* Implementation of hook_myhookname()
*/
function THISMODULENAME_myhookname(args){
//do stuff
}
Wie wird in dem von Ihnen geposteten Tutorial die Funktion “taxonomy_rockstar_generate_layouts” aufgerufen? (Entschuldigung für die Anfängerfrage. Ich bin neu genug bei Druapl, dass ich nicht genau sagen kann, wo die Dinge im System hingehören).
– Alan Sturm
14. Februar 2011 um 16:37 Uhr
Einige Korrekturen/Tipps: a) $args ist keine Referenz, wenn module_invoke_all() verwendet wird. b) Wenn Sie etwas als Referenz übergeben möchten, verwenden Sie entweder drupal_alter() (erzwingt das Suffix ‘_alter’ für Hook-Namen) oder module_implements + eine Schleife und rufen Sie dann die Implementierungen direkt auf. c) Der empfohlene Weg, Hooks zu dokumentieren, ist in einer yourmodule.api.php-Datei, siehe Kern für Beispiele. d) Ein gängiges Muster in D7 beim Sammeln von Informationen, wenn ein Info-Suffix verwendet und auch drupal_alter aufgerufen werden soll. Beispiel .
– Berdi
14. Februar 2011 um 17:41 Uhr
Guter Fang für die Referenz … Ich dachte an drupal_alter(), als ich es hinzugefügt und bearbeitet habe
– jps schlägt zurück
14. Februar 2011 um 17:46 Uhr
@jpstrikesback danke für die Klarstellung. Noch eine klärende Frage. Wo sollten Sie module_invoke_all aufrufen? Liege ich richtig, dass Sie einen der frühen Haken des Kernmoduls implementieren und dort einfügen würden? Oder etwas anderes?
– Alan Sturm
14. Februar 2011 um 18:06 Uhr
Oft erstellen Sie einen Hook, damit ein anderes Modul einige Daten ändern kann, bevor Sie etwas damit machen (und Sie könnten den Hook auch in Ihrem eigenen Modul verwenden). In diesem Fall würde ich module_invoke_all() direkt platzieren, bevor ich etwas mit den Daten mache. Beispiele finden Sie unter drupal_goto und dann Hier ist ein weiteres gutes Tutorial / Beispiel.
– jps schlägt zurück
14. Februar 2011 um 18:22 Uhr
Angenommen, Sie wollten hook_my_custom_goodness() für andere zur Verwendung erstellen. Platzieren Sie dann einfach Code wie diesen in Ihrem Modul an der Stelle, an der der Hook erfolgen soll:
$variables['msg'] = 'foo';
// Make sure at least one module implements our hook.
if (sizeof(module_implements('my_custom_goodness')) > 0) {
// Call modules that implement the hook, and let them change $variables.
$variables = module_invoke_all('my_custom_goodness', $variables);
}
drupal_set_message($variables['msg']); // Will display 'bar' instead.
Wenn nun jemand Ihren Hook verwenden möchte, könnte er dies in seinem eigenen Modul wie folgt tun:
Sie müssen zwei Hooks 1. hook_token_info() & 2. hook_tokens() in Ihrer Moduldatei implementieren. Unten habe ich Code angegeben, um mein benutzerdefiniertes Token “query-param-all” zu erstellen und dieses Token im Views-Textarea-Feld zu verwenden … ..
hilft das? Es ist schon eine Weile her, seit ich mit Drupal herumgespielt habe.
Um benutzerdefinierte Drupal-Hooks zu erstellen/anzubieten, müssen Sie so implementieren, dass das Aufrufen des Hooks mit module_invoke oder module_invoke_all keine Konflikte mit anderen Modul-Hooks verursacht. Der Name des Hooks sollte eindeutig sein und alle/spezifischen Funktionen so allgemein anbieten, dass keine Anpassungen mit Code erforderlich sind. Die gesamte Konfiguration muss auf Admin-Seiten erfolgen und sollte diese Konfigurationen in einer separaten Tabelle oder in vorhandenen Tabellen speichern, die von Drupal oder Modulen erstellt wurden, von denen Ihre Module abhängig sind. Der Hook sollte von anderen Modulen einfach zu implementieren sein und sollte nicht sehr komplex zu implementieren sein. Wenn Sie benutzerdefinierte Hooks erstellen, fungieren Ihre Module als API-Anbieter.
Für Drupal 6 und 7, drupal_alter() ist wahrscheinlich die beste Option.