Können Sie Ihren eigenen Hook in Drupal erstellen?

Lesezeit: 5 Minuten

Benutzer-Avatar
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.

Benutzer-Avatar
jps schlägt zurück

Module_invoke_all() ist Ihre Eintrittskarte zum Erstellen Ihrer eigenen Hooks:

Siehe die API:

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

und dann schauen Sie sich diese großartige Beschreibung an:

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

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

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:

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

Eine ausführlichere Erklärung gibt es hier:

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

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 … ..

/**
* Implements hook_token_info().
*/
function mycustom_token_info() {
  $type = [
      'name' => ('Custom Token'),
      'description' => ('Tokens for custom things.'),
  ];
  $node['query-param-all'] = [
      'name' => ("Get all URL query string"),
      'description' => ('Get all URL query string'),
  ];
  return [
      'types' => ['customtoken' => $type],
      'tokens' => ['customtoken' => $node],
  ];
}

/**
* Implements hook_tokens().
*/
function mycustom_tokens($type, $tokens, array $data, array $options, \Drupal\Core\Render\BubbleableMetadata $bubbleable_metadata) {
  $replacements = [];
  //print '<pre>'; print_r($data);exit;
  $current_path = \Drupal::request()->query->all();
  $query_param = '';
  if( count($current_path) > 0) {
    $amper="";
    $query_param = '?';
    foreach($current_path as $key => $value){
      $query_param .= $amper.$key.'='.$value;
      $amper="&";
    }
  }

  if ($type == 'customtoken') {
      foreach ($tokens as $name => $original) {
          switch ($name) {
              case 'query-param-all':
                  $replacements[$original] = $query_param;
              break;
          }
      }
  }
  return $replacements;
}

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 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.

Wie angegeben in die module_invoke_all() Dokumentation,

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 änderbare Variablen an bestimmte Hook_TYPE_alter()-Implementierungen.

1186160cookie-checkKönnen Sie Ihren eigenen Hook in Drupal erstellen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy