Hook eines anderen Moduls aufrufen?
Eingetragen von drupal_ftw (5)
am 24.11.2018 - 00:38 Uhr in
am 24.11.2018 - 00:38 Uhr in
Guten Tag,
ich würde gerne in Modul A einen Hook aus Modul B aufrufen und in B einen Hook aus A.
Allerdings funktioniert das Aufrufen von Hooks aus B in A nicht.
Es hat anscheinend etwas damit zu tun, in welcher Reihenfolge die Module geladen werden.
Normalerweise sollte man doch aber in jedem Modul auch jeden Hook aufrufen können?
Grüße
- Anmelden oder Registrieren um Kommentare zu schreiben
Handelt es sich um 2 custom
am 24.11.2018 - 14:53 Uhr
Handelt es sich um 2 custom Module oder ist eines davon Contrib? Um welchen Hook handelt es sich oder sind es zwei verschiedene, die beispielsweise in jedem Modul mit drupal_alter() aufgerufen werden? Der Anwendungsfall wäre hier ganz interessant.
Es handelt sich um 2 custom
am 24.11.2018 - 15:21 Uhr
Es handelt sich um 2 custom Module, mit 2 verschiedenen custom Hooks. Mit den Funktionen ist es das Gleiche. Ich kann Funktionen eines anderen Moduls nur dann aufrufen, wenn dieses zufällig vor meinem geladen worden ist.
Zitat: Es handelt sich um 2
am 24.11.2018 - 16:23 Uhr
Es handelt sich um 2 custom Module, mit 2 verschiedenen custom Hooks.
Wie sind die Hooks denn definiert? Sind es alter hooks (drupal_alter()) oder intercepting hooks (module_invoke())?
Ich kann Funktionen eines anderen Moduls nur dann aufrufen, wenn dieses zufällig vor meinem geladen worden ist.
Du kannst sicherstellen, dass eine Funktion zur Verfügung stellt, wenn du die Datei, in der die Funktion definiert hast mittels https://api.drupal.org/api/drupal/includes%21module.inc/function/module_... eingebunden hast.
Es sind module_invoke Hooks.
am 24.11.2018 - 19:18 Uhr
Es sind module_invoke Hooks. Ja genau, mit module_load_include funktioniert das auch, aber es sollte ja auch so gehen, wenn ich drupal richtig verstanden habe? Oder funktioniert das innerhalb von Modulen anders? Anders gefragt, wenn z.B. Modul B eine Abhängigkeit zu Modul A hat, muss dann Modul B immer A mit module_load_include einbinden?
Die Module haben einen weight
am 25.11.2018 - 00:27 Uhr
Die Module haben einen weight mit dem Du die Reihenfolge beeinflussen kannst.
Soweit ich weiss funktioniert das nur über die system Tabelle,
allerdings kannst du das direkt darin ändern.
https://www.drupal.org/docs/7/creating-custom-modules/howtos/how-to-upda...
MfG
Robert
https://awri.ch
Ich habe eine Schweizer Tastatur und daher kein scharfes ß ;-)
Hi Robert,danke für den
am 25.11.2018 - 13:23 Uhr
Hi Robert,
danke für den Hinweis. Ja, das würde auch funktionieren. Inzwischen habe ich herausgefunden, dass man das so, wie ich das machen wollte, einfach nicht macht. Stattdessen sollten solche Aufrufe immer in eine callback Funktion gewickelt werden.
Grüße
Und "wickelt" man nun korrekt
am 25.11.2018 - 15:42 Uhr
Und wie "wickelt" man nun korrekt Funktionen aus anderen Modulen in eine Callback-Funktion, wenn man sie in in einem anderen Modul benötigt?
Drupal rockt!!!
Soweit ich das verstanden
am 25.11.2018 - 15:55 Uhr
Soweit ich das verstanden habe, indem man einen beliebigen core Hook implementiert und in diesem dann den custom Code ausführt. Dort sollten dann auch die custom Funktionen/Hooks anderer Module verfügbar sein. Wahrscheinlich ist es wichtig, darauf zu achten, dass der core Hook, den man verwendet, erst ausgeführt wird nachdem alle Module geladen worden sind. Ich kenne mich mit Drupal noch nicht so gut aus, aber ich würde annehmen, dass es core Hooks gibt, die auch davor ausgeführt werden. Diese wären dann natürlich für unseren Zweck unbrauchbar.
Man kann eine beliebige
am 25.11.2018 - 18:48 Uhr
Man kann eine beliebige Funktion eines anderen Moduls immer aufrufen, wenn man den Namen kennt. Nun kann es aber vorkommen, daß die Datei des zweiten Modul, das die Funktion beinhaltet, zu diesem Zeitpunkt (noch) nicht geladen ist. Also muß man mit function_exists prüfen, ob die Funktion bereits bekannt ist und falls nicht, mit mit include_once die Datei mit der Funktion laden. Man weiß ja, wo sich diese Funktion befindet und kann daher gezielt laden. Danach gibt es die Funktion. Z.B. in einem Block eine Sichtbarkeitsprüfung
<?php
if (! function_exists ('xxx_showblock_seitenmenu') ){
include_once(base_path() . drupal_get_path('module', 'xxx_showblock') . '/xxx_showblock.module');
}
return xxx_showblock_seitenmenu('aaaa');
?>
.
Werner
drupal-training.de
Moderator und Drupal Trainer
* - - - - - - - - - - - - - - - - - - - - - - - - - - - *