【问题标题】:How do I extend a contributed module in Drupal?如何在 Drupal 中扩展贡献的模块?
【发布时间】:2010-12-10 14:56:44
【问题描述】:

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

【问题讨论】:

  • 需要更多信息。什么模块?你想做什么?
  • 如果您指定模块,您可以获得有关如何自定义该特定模块的建议。 Drupal 模块的标准化程度并不高,以至于一种定制解决方案适合所有人。

标签: drupal drupal-6 drupal-modules


【解决方案1】:

它是什么模块?某些模块提供 API,您可以通过编写自己的模块来扩展这些 API。有tons of modules that "extend" Views by building off of the Views API。如果您要扩展的模块没有好的 API,您可以随时 fork 以制作满足您需求的版本。也许它也会对其他人有所帮助。

【讨论】:

    【解决方案2】:

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

    最佳解决方案是:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

          找到一个很好的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()),并且您想要更改该 hook 更改的内容,请实现相同的 alter hook,确保它在从该模块实现的那个之后执行。

          如果你要修改的函数不是钩子,那么:

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

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-12-08
            • 2018-11-02
            • 2016-07-14
            • 1970-01-01
            • 1970-01-01
            • 2011-12-24
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多