web-dev-qa-db-fra.com

Remplacement de la fonctionnalité du module contribué

De temps en temps, j'ai besoin de pirater un module contribué pour ajouter un peu de fonctionnalités nécessaires, généralement quelque chose de spécifique au projet que les responsables du module ne voudraient probablement pas utiliser.

Actuellement, je crée un fichier de patch pour chaque hack, et je stocke tous ces fichiers de patch dans sites/all/modules. De cette façon, chaque fois que je mets à jour un module, je peux facilement réappliquer mes hacks et résoudre tout conflit.

Je ne peux pas m'empêcher de penser que je fais quelque chose de mal. Suis-je?

7
Dave

Un correctif ne s'applique pas nécessairement à une nouvelle version d'un module: il suffit que la fonction corrigée soit déplacée vers une ligne différente, ou que le code de cette fonction soit modifié, et le correctif ne s'applique plus. Pour que la fonction soit déplacée vers une ligne différente, il suffit qu'une autre fonction soit réécrite pour prendre plus de lignes (ou moins de lignes).

Une meilleure façon de modifier le comportement d'un module est, pour Drupal 7:

  • Si le module utilise du code pour un rappel de page que vous souhaitez modifier, modifiez le rappel de page avec hook_menu_alter () .
  • Si le module implémente une fonction de thème que vous souhaitez modifier, changez la fonction associée à hook_theme_registry_alter () . Alternativement, s'il suffit de changer les variables que la fonction thème obtient, alors vous pouvez implémenter la fonction de prétraitement pour cette fonction thème (par exemple hook_preprocess_rdf_metadata() pour theme_rdf_metadata () , et changer les variables que la fonction de thème obtiendra.
  • Si le module exécute une requête SQL en utilisant db_select () et attribue une balise à la requête, modifiez la requête exécutée avec hook_query_alter () .
  • Si le module implémente un hook dont vous ne voulez pas qu'il soit exécuté, vous pouvez implémenter hook_module_implements_alter () pour éviter qu'il ne soit exécuté.
  • Si le module implémente un alter hook (par exemple hook_page_alter () ), et que vous souhaitez changer ce que ce hook a modifié, implémentez le même alter hook, en étant sûr qu'il est exécuté après celui implémenté à partir de ce module.

Dans le cas où la fonction que vous souhaitez modifier n'est pas un crochet, alors:

  • Vérifiez que la fonction utilise des hooks implémentés à partir d'un autre module. Par exemple, node_save () invoque hook_node_presave () ; si je veux changer la propriété "changé" du nœud, je ne pirate pas node_save(), mais j'implémente plutôt hook_node_presave() pour la modifier.
  • Vérifiez que la fonction est référencée/utilisée à partir d'un crochet; dans ce cas, vous pouvez faire quelque chose pour ce crochet, comme je l'ai décrit précédemment.

Si quelque chose que j'ai dit jusqu'à présent ne s'applique pas, il est préférable de créer un module personnalisé et d'utiliser le code de l'autre module pour le créer. J'essaierais également de demander une demande de fonctionnalité pour le module existant, en espérant que la fonctionnalité soit implémentée.
Le piratage d'un module tiers n'est jamais une bonne idée, surtout parce que les mises à jour automatiques du module (via le gestionnaire de mise à jour ou Drush) ne seraient plus possibles pour ce module.

11
kiamlaluno

La plupart des modules sont livrés avec des crochets pour remplacer la plupart des fonctionnalités du module et des fonctions de thème pour contourner les thèmes. Vous devriez essayer de l'utiliser dans la plupart des cas. Et éviter de pirater le code lui-même.

Si vous êtes absolument sûr que ce que vous voulez réaliser n'est pas quelque chose qui peut être fait avec les remplacements, l'option suivante que je choisirais est de créer une copie du module et de lui donner un autre nom et même de supprimer les fonctions que je vraiment pas besoin de créer de nouveaux modules.

Si les changements sont très peu nombreux, je ne vois aucun inconvénient à changer le code lui-même, mais je dois garder une trace des changements pour le faire fonctionner à nouveau après une mise à niveau, ce que je suppose que vous faites déjà.

2
Mohammed Shameem

Oui, OMI, vous "faites mal les choses", mais peut-être que les exigences de votre projet sont juste inférieures à mes exigences moyennes de projet :) Mettez tous vos correctifs et versions de module dans un fichier drush make afin que vous puissiez toujours construire votre plate-forme avec drush si il se passe quelque chose.

http://drupal.org/project/drush_make

Créer des fichiers est très simple à écrire une fois que vous connaissez la syntaxe.

1
David Meister