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

时间:2009-10-27 19:16:20

标签: drupal drupal-6 drupal-modules

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

5 个答案:

答案 0 :(得分:7)

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

最佳解决方案是:

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

答案 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()的模块即可。大多数情况下,当您想要修改模块的行为方式时,您还需要更改它使用的设置表单(或其使用的任何其他表单,如果是这种情况)。