10

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

4

5 回答 5

7

尽可能避免对模块进行黑客攻击或分叉。破解模块会给您带来更少的“破解核心”痛苦,并且分叉模块(没有明显优越的架构和功能集)只会进一步混淆模块水 - 使网站建设者更难做出有效的决定关于使用什么。

最好的解决方案是:

  1. 使用模块提供的任何 API。有时,您可以将某些函数用作 API 调用,但不一定是这样的。
  2. 创建附加功能并将补丁提交到模块问题队列,这样其他人可能会从您的工作中受益,因此您可能会从安全审计中受益,而无需付出太多努力。
  3. 并非总是如此,但通常您可以创建一个自定义模块来实现 hook_form_alter 并添加一个提交处理程序,该处理程序会返回您的模块进行处理。
于 2009-10-27T22:42:47.167 回答
7

找到了一篇关于在 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() 来更改它。

  • 检查函数是否被钩子引用/使用;在这种情况下,你可以为那个钩子做一些事情,就像我之前描述的那样。

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

于 2013-12-26T09:53:05.620 回答
2

它是什么模块?某些模块提供 API,您可以通过编写自己的模块来扩展这些 API。有大量模块通过构建 Views API 来“扩展”视图。如果您要扩展的模块没有好的 API,您可以随时 fork 以制作满足您需求的版本。也许它也会帮助别人。

于 2009-10-27T19:18:39.497 回答
1

要更改模块显示的形式,您可以简单地创建一个实现hook_form_alter()或的模块hook_form_FORM_ID_alter()。大多数时候,当您想要修改模块的行为方式时,您还需要更改它使用的设置形式(或任何其他形式)。

于 2009-12-16T23:00:14.080 回答
1

即使我们需要使用某些功能,我们也可以通过以下方式来实现。我们需要从模块中复制函数,然后将函数粘贴到您的 template.php 文件中。比您可以相应地对该功能进行更改。

于 2011-02-10T09:33:59.890 回答