Überschreiben der beitragenden Modulfunktionalität

7

Von Zeit zu Zeit muss ich einen kleinen Hack an einem bereitgestellten Modul durchführen, um ein wenig benötigte Funktionalität hinzuzufügen, normalerweise etwas Spezifisches für das Projekt, das die Modulbetreuer wahrscheinlich nicht verwenden möchten.

Derzeit erstelle ich für jeden Hack eine Patch-Datei und speichere alle diese Patch-Dateien in sites / all / modules. Auf diese Weise kann ich bei jedem Update eines Moduls meine Hacks problemlos erneut anwenden und Konflikte beheben.

Ich kann nicht anders, als das Gefühl zu haben, dass ich etwas falsch mache. Bin ich

Dave
quelle

Antworten:

11

Ein Patch gilt nicht unbedingt für eine neue Version eines Moduls: Es reicht aus, wenn die gepatchte Funktion in eine andere Zeile verschoben wird oder der Code für diese Funktion geändert wird und der Patch nicht mehr gilt. Damit die Funktion in eine andere Zeile verschoben werden kann, reicht es aus, wenn eine andere Funktion neu geschrieben wird, um mehr Zeilen (oder weniger Zeilen) aufzunehmen.

Eine bessere Möglichkeit, das Verhalten eines Moduls zu ändern, ist für Drupal 7:

  • Wenn das Modul Code für einen Seitenrückruf verwendet, den Sie ändern möchten, ändern Sie den Seitenrückruf mit hook_menu_alter () .
  • Wenn das Modul eine Themenfunktion implementiert, die Sie ändern möchten, ändern Sie die mit hook_theme_registry_alter () verknüpfte Funktion . Wenn es alternativ ausreicht, die Variablen zu ändern, die die Themenfunktion erhält, können Sie die Vorverarbeitungsfunktion für diese Themenfunktion implementieren (z. B. hook_preprocess_rdf_metadata()für theme_rdf_metadata () , und die Variablen ändern, die die Themenfunktion 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 möchten, dass er ausgeführt wird, können Sie hook_module_implements_alter () implementieren , um zu vermeiden, dass er ausgeführt wird.
  • Wenn das Modul einen Alter-Hook implementiert (z. B. hook_page_alter () ) und Sie ändern möchten, 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 möchten, kein Hook ist, gilt Folgendes:

  • Überprüfen Sie, ob die Funktion Hooks verwendet, die von einem anderen Modul implementiert wurden. Zum Beispiel node_save () aufruft hook_node_presave () ; Wenn ich die "geänderte" Eigenschaft des Knotens ändern möchte, hacke ich nicht node_save(), sondern implementiere sie hook_node_presave(), um sie zu ändern.
  • Überprüfen Sie, ob die Funktion von einem Hook aus referenziert / verwendet wird. In diesem Fall können Sie etwas für diesen Haken tun, wie ich zuvor beschrieben habe.

Wenn etwas, was ich bisher gesagt habe, nicht zutrifft, ist es besser, ein benutzerdefiniertes Modul zu erstellen und es mit dem Code des anderen Moduls zu erstellen. Ich würde auch versuchen, eine Funktionsanforderung für das vorhandene Modul zu stellen, in der Hoffnung, dass die Funktion implementiert ist.
Das Hacken eines Drittanbieter-Moduls ist niemals eine gute Idee, insbesondere weil automatische Updates des Moduls (über den Update Manager oder Drush) für dieses Modul nicht mehr möglich wären.

kiamlaluno
quelle
2

Die meisten Module werden mit Hooks geliefert, um viele der Funktionen des Moduls zu überschreiben, und mit Themenfunktionen, um die Themen zu überschreiben. Sie sollten versuchen, dies in den meisten Fällen zu verwenden. Und vermeiden, den Code selbst zu hacken.

Wenn Sie absolut sicher sind, dass das, was Sie erreichen möchten, nicht mit den Überschreibungen erreicht werden kann, würde ich als nächstes eine Kopie des Moduls erstellen und ihm einen anderen Namen geben und sogar die Funktionen, die ich habe, entfernen brauche und erstelle wirklich keine neuen Module daraus.

Wenn die Änderungen sehr gering sind, sehe ich keinen Schaden darin, den Code selbst zu ändern, sondern muss die Änderungen nachverfolgen, damit er nach einem Upgrade, das Sie vermutlich bereits durchführen, wieder funktioniert.

Mohammed Shameem
quelle
1
Vielen Dank. Ich benutze wenn möglich Haken. Die Hacks, auf die ich mich beziehe, sind immer ziemlich geringfügig, so dass das Kopieren eines Moduls mehr Probleme bereiten kann, als es wert ist, insbesondere für den Umgang mit Modulaktualisierungen.
Dave
Also ich denke du bist auf dem richtigen Weg :-)
Mohammed Shameem
1

Ja, IMO, du machst es "falsch", aber vielleicht sind deine Projektanforderungen nur geringer als meine durchschnittlichen Projektanforderungen :) Füge alle deine Patches und Modulversionen in eine Drush-Make-Datei ein, damit du deine Plattform immer mit Drush aufbauen kannst, wenn etwas passiert.

http://drupal.org/project/drush_make

Das Schreiben von Dateien ist sehr einfach, sobald Sie die Syntax kennen.

David Meister
quelle