Wie kann ich ein bestehendes Modul erweitern, ohne es zu verändern? Eigentlich handelt es sich um ein beigesteuertes Modul, ich will es also nicht hacken. Aber ich möchte es ändern und bestimmte Funktionen hinzufügen. Ich bin neu in Drupal und wenn ich Tutorials darüber lese, höre ich immer wieder eine Sache - Don't hack the core... und ich glaube, das gleiche gilt auch für Module.
Antworten
Zu viele Anzeigen?Vermeiden Sie es nach Möglichkeit, das Modul zu hacken oder zu forken. Durch das Hacken des Moduls erhalten Sie eine geringere Variante des "Hacking-Core"-Schmerzes, und das Forking des Moduls (ohne eine deutlich bessere Architektur und einen größeren Funktionsumfang) trübt das Modulwasser nur weiter ein und macht es für Website-Ersteller noch schwieriger, eine effektive Entscheidung darüber zu treffen, was sie verwenden sollen.
Die besten Lösungen sind:
- Verwenden Sie eine vom Modul bereitgestellte API. Manchmal gibt es Funktionen, die Sie als API-Aufrufe verwenden können, die aber nicht unbedingt dafür gedacht sind.
- Erstellen Sie die zusätzlichen Funktionen und senden Sie einen Patch an die Warteschlange für Modulprobleme, damit andere von Ihrer Arbeit profitieren können und Sie ohne viel Aufwand von Sicherheitsaudits profitieren können.
- Nicht immer, aber oft können Sie weit gehen, indem Sie ein benutzerdefiniertes Modul erstellen, das hook_form_alter implementiert und einen Submit-Handler hinzufügt, der zur Verarbeitung zurück zu Ihrem Modul führt.
Ich habe eine sehr gute Beitrag über die Erweiterung eines Moduls in Drupal. Wesentliche Teile:
-
Wenn das Modul Code für einen Seiten-Callback verwendet, den Sie ändern möchten, ändern Sie den Seiten-Callback mit hook_menu_alter().
-
Wenn das Modul eine Theme-Funktion implementiert, die Sie ändern möchten, ändern Sie die mit hook_theme_registry_alter() verbundene Funktion. Wenn es ausreicht, die Variablen zu ändern, die die Theme-Funktion erhält, können Sie alternativ die Vorverarbeitungsfunktion für diese Theme-Funktion implementieren (z. B. hook_preprocess_rdf_metadata() für theme_rdf_metadata()) und die Variablen ändern, die die Theme-Funktion erhält.
-
Wenn das Modul eine SQL-Abfrage mit db_select() ausführt und der Abfrage ein Tag zuweist, ändern Sie die ausgeführte Abfrage mit hook_query_alter().
-
Wenn das Modul einen Hook implementiert, von dem Sie nicht wollen, dass er ausgeführt wird, können Sie hook_module_implements_alter() implementieren, um zu verhindern, dass er ausgeführt wird.
-
Wenn das Modul einen Alter Hook implementiert (z.B. hook_page_alter()) und Sie ändern wollen, was dieser Hook geändert hat, implementieren Sie denselben Alter Hook und stellen Sie sicher, dass er nach dem von diesem Modul implementierten ausgeführt wird.
Wenn die Funktion, die Sie ändern wollen, kein Hook ist, dann:
-
Prüfen Sie, ob die Funktion Hooks verwendet, die von einem anderen Modul implementiert wurden. Zum Beispiel ruft node_save() hook_node_presave() auf; wenn ich die Eigenschaft "changed" des Knotens ändern möchte, hacke ich nicht node_save(), sondern implementiere lieber hook_node_presave(), um sie zu ändern.
-
Prüfen Sie, ob diese Funktion von einem Hook referenziert/verwendet wird; in diesem Fall können Sie etwas für diesen Hook tun, wie ich zuvor beschrieben habe.
Wenn alles, was ich bis jetzt gesagt habe, nicht zutrifft, dann ist es besser, ein benutzerdefiniertes Modul zu erstellen und den Code des anderen Moduls zu verwenden, um es zu erstellen. Ich würde auch versuchen, eine Funktionsanforderung für das bestehende Modul zu stellen, in der Hoffnung, dass die Funktion implementiert wird. Ein Modul eines Drittanbieters zu hacken ist nie eine gute Idee, vor allem weil automatische Updates des Moduls (über den Update Manager oder Drush) für dieses Modul nicht mehr möglich wären.
Um welches Modul handelt es sich? Einige Module bieten APIs, die Sie durch das Schreiben eines eigenen Moduls erweitern können. Es gibt eine Vielzahl von Modulen, die Views erweitern", indem sie auf der Views-API aufbauen . Wenn das Modul, das Sie erweitern möchten, keine gute API hat, können Sie es jederzeit abspalten, um eine Version zu erstellen, die Ihren Bedürfnissen entspricht. Vielleicht hilft das auch jemand anderem.
Um das vom Modul angezeigte Formular zu ändern, können Sie einfach ein Modul erstellen, das folgende Funktionen implementiert hook_form_alter()
ou hook_form_FORM_ID_alter()
. Wenn Sie das Verhalten eines Moduls ändern wollen, müssen Sie in den meisten Fällen auch das Einstellungsformular (oder ein anderes Formular) ändern, das es verwendet.