如何在Drupal中扩展贡献模块?

apn*_*rve 6 drupal drupal-6 drupal-modules

如何在不修改现有模块的情况下扩展现有模块?实际上它是一个贡献的模块,所以我不想破解它.但我想改变并添加某些功能.我是drupal的新手,当我阅读有关它的教程时,我一次又一次地听到一件事 - 不要破解核心......而且我相信同样适用于模块.

Gra*_*ide 7

尽可能避免黑客攻击或分叉模块.黑客攻击模块会给你带来较少的"黑客核心"痛苦,并且分支模块(没有明显优越的架构和功能集).只是让模块水进一步混乱 - 使得站点建设者更难以做出有效决策关于使用什么.

最好的解决方案是:

  1. 使用模块提供的任何API.有时您可以使用函数作为API调用,这些函数不一定是这样的.
  2. 创建附加功能并向模块发布队列提交补丁,以便其他人可以从您的工作中受益,因此您可以从安全审核中受益,而不会有太大的麻烦.
  3. 并非总是如此,但通常您可以创建一个实现hook_form_alter的自定义模块,并添加一个提交处理程序,该处理程序可以返回到您的模块进行处理.


Tec*_*nic 6

找到一篇关于在drupal中扩展模块的非常好的帖子.基本部分:

  • 如果模块使用您想要更改的页面回调的代码,请使用hook_menu_alter()更改页面回调.

  • 如果模块实现了您想要更改的主题函数,请更改与hook_theme_registry_alter()关联的函数.或者,如果足以更改主题函数获得的变量,则可以为该主题函数实现预处理函数(例如,为theme_rdf_metadata()实现hook_preprocess_rdf_metadata(),并更改主题函数将获得的变量.

  • 如果模块使用db_select()执行SQL查询,并为查询分配标记,请使用hook_query_alter()更改执行的查询.

  • 如果模块实现了一个你不希望它被执行的钩子,你可以实现hook_module_implements_alter()以避免它被执行.

  • 如果模块实现了一个alter hook(例如hook_page_alter()),并且你想要更改钩子改变的内容,则实现相同的alter hook,确保它在从该模块实现的那个之后执行.

如果您要更改的函数不是钩子,则:

  • 检查该功能是否正在使用从其他模块实现的挂钩.例如,node_save()调用hook_node_presave(); 如果我想要更改节点的"已更改"属性,我不会破解node_save(),但我宁愿实现hook_node_presave()来改变它.

  • 检查函数是否从钩子引用/使用; 在这种情况下,你可以为那个钩子做点什么,就像我之前描述的那样.

如果到目前为止我所说的任何内容都不适用,那么最好创建一个自定义模块,并使用其他模块的代码来创建它.我也会尝试询问现有模块的功能请求,希望该功能得以实现.黑客攻击第三方模块绝不是一个好主意,特别是因为模块的自动更新(通过Update Manager或Drush)不再可能.

更多关于通过创建一个新的扩展现有模块可以在这个简单的例子可以找到这里.