如何覆盖另一个模块中存在的函数

时间:2010-12-01 21:08:09

标签: drupal drupal-6 drupal-modules

我想覆盖comment_save函数。有没有办法覆盖它,以便我可以添加我的功能?

创建http://drupal.org/node/375833这样的触发器是最好的方法吗?这似乎不太可靠,因为它发生在事后。

BTW,这是在D6。

3 个答案:

答案 0 :(得分:5)

这很棘手。首先,我建议转而看看你是否可以使用hook_comment(http://api.drupal.org/api/drupal/developer--hooks--core.php/function/hook_comment/6)管理你需要的东西。这真的更像是需要它。

如果确实需要覆盖comment_save,那么通常一个好的选择是环顾一下所谓的内容。对于这种情况,你很幸运 - 只在comment.form_submit内注释的1542行的一个地方调用comment_save。

现在,comment_form_submit是一个表单提交函数 - 而不是替换comment_save,我们可以改为创建自己的自定义版本的comment_form_submit(为了参数的缘故,我们假设我们正在'custom_module'模块中工作) - 所以我要做的是创建一个名为custom_module_comment_form_submit的新函数,它调用我有兴趣使用的comment_save变体,然后使用hook_form_alter()(http://api.drupal.org/api/drupal/developer--hooks--core.php/function/hook_form_alter/6)来设置$ form ['#submit']用'custom_module_comment_form_submit'替换值'comment_form_submit'。

这并不完美 - 如果您安装另一个使用comment_save的模块,那么您需要找到类似的解决方法。如果在Drupal中发现了一个错误或安全漏洞,这个漏洞已在您正在此处工作的部分中修复,那么您将不会在代码中修复该安全漏洞。但如果你绝对必须替换comment_save,这几乎是唯一的方法。

答案 1 :(得分:2)

您不能“覆盖”comment_save函数,但可以在自定义模块中实现hook_comment。

请参阅有关该主题的drupal.org's文档。

有问题的两个$ ops将是:

  • “insert”:正在插入评论。
  • “更新”:评论正在更新。

希望这有帮助

答案 2 :(得分:1)

虽然肯定不理想,但有时我创建了自己的自定义模块,其中包含修改后的功能,然后注释掉了原始版本(并添加了足够的注释以告诉其他人为什么要这样做。)这样一来,如果你忘记了升级具有原始功能的模块,它会引发错误,说明已经声明该功能提醒您重新评估或至少重新评论它。钩子肯定是最好的做法,但是在紧要关头,这至少比你在现有模块中实际编辑函数更好。在少数情况下,我发现这对于让某些模块很好地协同工作是必要的。

相关问题