Wie erstelle und verwende ich einen benutzerdefinierten Hook?

10

Ich habe hier eine Frage gestellt , die einen Vorschlag hatte, aber keine Antwort. Hat jemand Ratschläge zur Implementierung eines benutzerdefinierten Hooks in Drupal 8, mit dem andere Module ein Inhaltsverzeichnis aktualisieren können, das von einem übergeordneten Modul erstellt wird? Das Inhaltsverzeichnis ist eine ungeordnete Liste.

Kevin Nowaczyk
quelle
2
Schauen Sie sich hier den Abschnitt unter "So definieren Sie einen Haken:" an . Hilft das?
Clive
Nur teilweise. Hier wird erläutert, wie Sie einen Hook für die untergeordnete Funktion erstellen, jedoch nichts darüber, wie das übergeordnete Modul den Inhalt rendert. Verwendet der Elternteil einen Controller, um beispielsweise $ output ['table_of_contents'] Inhalt hinzuzufügen, und hängt der Hook des Elternteils die vom Kind zurückgegebenen Daten an dieses Array an?
Kevin Nowaczyk
2
@ KevinNowaczyk es kommt auf den Zweck des Hakens an. Ein Hook ist nicht spezifisch für das Rendern, kann aber dafür verwendet werden. Wenn Sie einen benutzerdefinierten Hook zum Bereitstellen von Inhalten erstellen möchten und den Hook an der Stelle aufrufen, an der Sie den Inhalt benötigen, funktioniert dies. Und da der Hook benutzerdefiniert und neu für Ihre Funktion ist, müssen Sie definieren, wie der Hook seine Ergebnisse liefern soll. Wenn Sie dann den Hook während Ihrer übergeordneten Renderfunktion aufrufen, können Sie die Ergebnisse in einem verwendbaren Format erhalten.
Neograph734

Antworten:

8

Dieser Abschnitt befindet sich in einem Controller im übergeordneten Modul:

$plugin_items = [];
// Call modules that implement the hook, and let them add items.
\Drupal::moduleHandler()->alter('flot_examples_toc', $plugin_items);
if (count($plugin_items > 0)) {
  $output['plugins'] = [
    '#title' => 'Plugins',
    '#theme' => 'item_list',
    '#items' => $plugin_items,
  ];
}

Und dies befindet sich in der untergeordneten [Modul] .module-Datei.

use Drupal\Core\Url;

function mymodule_flot_examples_toc_alter(&$item_list) {
  $options = [
    ':one' => Url::fromRoute('flot_spider_examples.example')->toString(),
  ];
  $item_list[] = t('<a href=":one">Spider Chart</a> (with spider plugin)', $options);
}

Das übergeordnete Element erstellt ein Array und übergibt es als Referenz an die untergeordneten Elemente. Sie können das Array ändern, indem Sie ihm Elemente hinzufügen. Das übergeordnete Element fügt es dann dem Render-Array hinzu.

Kevin Nowaczyk
quelle
5

Nur der Einfachheit halber, wenn Sie einen benutzerdefinierten Hook in Drupal 8 erstellen und verwenden möchten, den andere Entwickler verwenden können

Um anderen zu helfen, die Verwendung Ihres Hooks in der Datei mymodule.api.php zu definieren, kann dieser Hook auf alles reagieren, was erforderlich ist.

Beispiel:

 // my hook 
 function hook_mymodule_alter_something(array &$data) {
   // here others will make a module that will call this to alter "$data"
 }

dann bei Bedarf in Ihrem Modul.

 \Drupal::moduleHandler()->invokeAll('mymodule_alter_something', [&$data]);

dann kann der andere Entwickler dies durch Aufrufen nutzen

function MYOTHERMODULE_mymodule_alter_something($data) {
Taggart Jensen
quelle