it-swarm.com.de

Können Sie Ihren eigenen Hook in Drupal erstellen?

Ist es möglich, ein eigenes Hook in einem Drupal-Modul zu erstellen, damit andere Drupal-Module verwendet werden können? Wenn nicht, gibt es in Drupal einen Mechanismus, mit dem Drittanbieter-Entwickler Hooks bereitstellen können? Wenn bisher alles ein Nein war, wo ist dann im Kern die Liste der Haken implementiert?

Soweit ich weiß, funktionieren Drupal-Module auf einem Ereignis wie dem System hooks . Wenn Sie ein neues Modul erstellen, erstellen Sie Funktionen, die einen Hook implementieren. Zum Beispiel gibt es einen hook_delete-Hook. Wenn Sie eine Funktion in Ihrem Modul implementieren

function mymodule_delete($node)
{
}

diese Funktion wird aufgerufen, wenn ein Knoten gelöscht wird.

Was ich wissen möchte ist, gibt es eine Möglichkeit, wie ich als Modulentwickler eines Drittanbieters meine eigenen Hooks erstellen kann. Sagen wir so etwas wie hook_alanskickbutthook, damit andere Modulentwickler diesen Hook abonnieren können.

Wenn dies 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 schwindlig, wenn ich anfange, im Drupal-Quellcode zu stöbern (ich verstehe Rekursion, aber ich verbringe nicht genug Zeit damit, über rekursive Probleme nachzudenken). Vollständige Lösungen sind willkommen, aber ich bin froh, nur in die richtige Richtung weisen zu können.

33
Alan Storm

Module_invoke_all () ist Ihr Ticket zum Erstellen eigener Hooks:

siehe die API:

http://api.drupal.org/api/drupal/includes--module.inc/function/module_invoke_all

und dann schau dir dieses großartige Schreiben an:

http://web.archive.org/web/20101227170201/http://himerus.com/blog/himerus/creating-hooks-your-drupal-module

(edit: war unter http://himerus.com/blog/himerus/creating-hooks-your-drupal-module aber das ist jetzt weg)

Nachdem Sie Ihren Hook erstellt haben, können Sie ihn in einem anderen Modul aufrufen: 

/**
 * Implementation of hook_myhookname()
 */

function THISMODULENAME_myhookname(args){
  //do stuff
}
37
jpstrikesback

Angenommen, Sie möchten hook_my_custom_goodness () für andere Benutzer erstellen. Dann platzieren Sie einfach den Code wie folgt in Ihrem Modul an der Stelle, an der der Hook stattfinden 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 jemand Ihren Hook verwenden möchte, kann er dies in seinem eigenen Modul wie folgt tun:

/**
 * Implements hook_my_custom_goodness().
 */
function SOME_OTHER_MODULE_my_custom_goodness($variables) {
  $variables['msg'] = 'bar';
  return $variables;
}

Hier gibt es eine ausführlichere Erklärung:

http://tylerfrankenstein.com/code/drupal-create-custom-hook-for-other-module

6

Für Drupal 6 & 7 ist drupal_alter () wahrscheinlich die beste Option.

Wie in der Dokumentation zu module_invoke_all () angegeben,

Alle Argumente werden als Wert übergeben. Verwenden Sie drupal_alter (), wenn Sie Argumente als Referenz übergeben müssen.

Verwenden Sie in Drupal 8 ModuleHandler :: alter .

Übergibt veränderbare Variablen an bestimmte Implementierungen von hook_TYPE_alter () .

0
colan

Wenn ich mich erinnere ... http://api.drupal.org/api/drupal/modules--node--node.api.php/function/hook_delete/7

hilft das? Es ist schon eine Weile her, seit ich mich mit Drupal beschäftigt habe.

Um benutzerdefinierte Drupal-Hooks zu erstellen/anzubieten, müssen Sie die Implementierung so durchführen, 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 sollte alle/spezifischen Funktionen so allgemein bieten, 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, die von Drupal erstellt werden, oder von Modulen speichern, von denen Ihre Module abhängen. Der Hook sollte von anderen Modulen leicht zu implementieren sein und sollte nicht sehr komplex zu implementieren sein. Wenn Sie benutzerdefinierte Hooks erstellen, fungieren Ihre Module als API-Anbieter.

0
Brian