Kann ich die Reihenfolge ändern, in der die Hook-Implementierung durch verschiedene Module aufgerufen wird?

7

In D6 verwende ich ein Contrib-Modul, möchte aber einen kleinen Teil seines Verhaltens überschreiben. Ich habe ein benutzerdefiniertes Modul dafür, aber meine Implementierung des relevanten Hooks wird vor der Implementierung im Contrib-Modul aufgerufen, sodass die Version des Contrib-Moduls "gewinnt".

Gibt es eine Möglichkeit, dies zu ändern und meinen eigenen Haken zu zwingen, zuletzt aufgerufen zu werden?

Hier sind die spezifischen Details:

Ich möchte den Standardbenutzernamen "Anonym" für nicht registrierte Benutzer im Kommentarformular entfernen. Ich habe ein kleines benutzerdefiniertes Modul erstellt, tweak_comment_form, das form_alter hook implementiert und den Standardwert aus dem Namensfeld entfernt ( siehe die Antworten auf meine vorherige Frage dazu ).

Ich verwende jedoch auch ein Contrib-Modul namens RealName , das auch form_alter implementiert. RealName macht das, was ich für registrierte Benutzer möchte (ersetzt den Benutzernamen durch "echten Namen"), weist dem Namensfeld jedoch den Standardwert neu zu.

Daphshez
quelle

Antworten:

7

Ja, ganz einfach, Sie müssen das Gewicht Ihres Moduls so einstellen, dass es schwerer ist. Es gibt einige Möglichkeiten, wie Sie dies tun können. Wenn es sich bei Ihrem Modul jedoch um ein Contrib-Modul handelt, das wieder auf Drupal.org veröffentlicht wird, ist es am besten, es hook_install()mit Code wie folgt einzurichten :

db_query("UPDATE {system} SET weight = 100 WHERE name = 'MYMODULE'");

Alternativ können Sie das Utility-Modul verwenden , um die Modulgewichte auf der Modulseite festzulegen. Dies gilt jedoch nur für Ihre persönliche Installation.

Entziffern
quelle
1
Danke, das ist sehr hilfreich. Ich denke, wenn ich nur eine schnelle Lösung möchte und das Utility-Modul nicht installieren möchte, kann ich einfach die Datenbank aktualisieren ...
Daphshez
Es ist üblich, dass ein Modul, das nach einem anderen ausgeführt werden muss, sein eigenes Gewicht in der Tabelle "System" ändert. Keines der Module, von denen ich den Code kenne, hängt vom Utility-Modul ab, um sein eigenes Gewicht zu ändern.
Kiamlaluno
@kiamlaluno Ich habe Utility nicht als Abhängigkeit vorgeschlagen, sondern als Utility für OP, um das Gewicht auf seinem eigenen System zu ändern. Wenn er ein Contrib-Modul veröffentlichen würde, dann nein, es wäre definitiv keine Lösung.
Entschlüsseln Sie den
1
Ich nahm an, dass die Frage aus Entwicklersicht gestellt wurde, und ich nahm an, dass Ihr Vorschlag für den Entwickler war. Jetzt haben Sie verstanden, dass Sie gemeint haben, dass das Ändern des Gewichts eines Moduls, das auf Ihrer eigenen Site (oder auf von Ihnen verwalteten Sites) installiert ist, nicht erforderlich ist, um ein benutzerdefiniertes Modul zu erstellen, nur um das Gewicht eines anderen Moduls zu ändern.
Kiamlaluno
4

Ebenso wie zusätzliche hilfreiche Informationen in drupal7 haben Sie hook_module_implements_alter.

Dort können Sie auch die Hooks anderer Module ändern, z. B. Ihr Modul an das Ende / den Anfang verschieben.

Daniel Wehner
quelle
Ich denke, dies sollte die akzeptierte Antwort sein :)
Gokul NK
Können Sie uns ein kurzes Beispiel geben?
Leymannx
1
function my_module_module_implements_alter(&$implementations, $hook) {
  if ($hook != 'the_hook_to_change') {
    return;
  }
  $module = 'my_module';
  $group = array($module => $implementations[$module]);
  unset($implementations[$module]);

  $implementations = $group + $implementations; // If you want your implementation to run first.
  //$implementations = $group + $implementations; If you want your implementation to run last.
}

Kleine Änderung basierend auf https://api.drupal.org/comment/48623#comment-48623

Gokul NK
quelle