如何在不修改现有模块的情况下扩展它?实际上它是一个贡献的模块,所以我不想破解它。但我想改变并添加某些功能。 我是drupal的新手,当我阅读有关它的教程时,我一次又一次地听到一件事 - 不要破解核心......而且我相信同样适用于模块。
答案 0 :(得分:7)
尽可能避免黑客攻击或分叉模块。黑客攻击模块会给你带来较少的“黑客核心”痛苦,并且分支模块(没有明显优越的架构和功能集)。只是让模块水进一步混乱 - 使得站点建设者更难以做出有效决策关于使用什么。
答案 1 :(得分:6)
找到一个非常好的 post 关于在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,确保它在从该模块实现的那个之后执行。 / p>
如果您想要改变的功能不是钩子,那么:
检查该功能是否正在使用从其他模块实现的挂钩。例如,node_save()调用hook_node_presave();如果我想要更改节点的“已更改”属性,我不会破解node_save(),但我宁愿实现hook_node_presave()来改变它。
检查钩子是否引用/使用该函数;在这种情况下,你可以为那个钩子做点什么,就像我之前描述的那样。
如果我之前所说的任何内容都不适用,那么最好创建一个自定义模块,并使用其他模块的代码来创建它。我也会尝试询问现有模块的功能请求,希望该功能得以实现。 黑客攻击第三方模块绝不是一个好主意,特别是因为模块的自动更新(通过Update Manager或Drush)不再可能用于该模块。
有关通过创建新模块扩展现有模块的更多信息,请参阅此简单示例 here 。
答案 2 :(得分:2)
它是什么模块?有些模块提供了API,您可以通过编写自己的模块来扩展这些API。有tons of modules that "extend" Views by building off of the Views API。如果您要扩展的模块没有良好的API,您可以随时将其分叉以生成满足您需求的版本。也许它也可以帮助其他人。
答案 3 :(得分:1)
即使我们需要使用某些功能,我们也可以通过以下方式进行操作。 我们需要从模块中复制函数,我们可以在template.php文件中调整函数。你可以相应地对这个功能做出改变。
答案 4 :(得分:0)
要更改模块显示的表单,您只需创建一个实现hook_form_alter()
或hook_form_FORM_ID_alter()
的模块即可。大多数情况下,当您想要修改模块的行为方式时,您还需要更改它使用的设置表单(或其使用的任何其他表单,如果是这种情况)。