繁体   English   中英

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

[英]How do I extend a contributed module in Drupal?

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

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

最好的解决方案是:

  1. 使用模块提供的任何 API。 有时,您可以将某些函数用作 API 调用,但这些函数不一定是那样设计的。
  2. 创建附加功能并向模块问题队列提交补丁,这样其他人就可以从您的工作中受益,因此您可以毫不费力地从安全审计中受益。
  3. 并非总是如此,但通常您可以创建一个自定义模块来实现 hook_form_alter 并添加一个提交处理程序,该处理程序返回您的模块进行处理。

找到了一篇关于在 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()),并且你想改变那个hook改变的东西,实现相同的alter hook,确保它在从那个模块实现的那个之后执行。

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

  • 检查该函数是否正在使用从其他模块实现的钩子。 例如,node_save() 调用 hook_node_presave(); 如果我想更改节点的“已更改”属性,我不会破解 node_save(),而是实现 hook_node_presave() 来更改它。

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

如果到目前为止我说的任何内容都不适用,那么最好创建一个自定义模块,并使用另一个模块的代码来创建它。 我还会尝试为现有模块提出功能请求,希望该功能得到实现。 破解第三方模块从来都不是一个好主意,特别是因为该模块不再可能自动更新模块(通过更新管理器或 Drush)。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM