10 Stimmen

Wie kann ich ein beigetragenes Modul in Drupal erweitern?

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.

7voto

Grayside Punkte 3964

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:

  1. 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.
  2. 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.
  3. 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.

7voto

Technotronic Punkte 7760

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.

2voto

jergason Punkte 19447

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.

1voto

apaderno Punkte 26483

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.

1voto

Jyotisankar Punkte 11

Auch wenn wir einige Funktionen nutzen müssen, können wir dies auf die folgende Weise tun. Wir müssen die Funktion aus dem Modul kopieren und können die Funktion in die Datei template.php einfügen. Dann können Sie die Funktion entsprechend ändern.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X