是否有一种方法可以改变第三方模块或核心模块给出的钩子的实现? -- 7 领域 和 hooks 领域 drupal 相关 的问题

Is there a way to alter the implementation of a hook given by a third-party module, or a core module?


4
vote

问题

中文

我有一个模块,应该替换另一个模块完成的钩子的实现。
司布7有可能做到吗?如果有可能,在哪个条件下?

通过替换由另一个模块完成的钩子的实现,我的意思是使用drupal启用时自动调用的函数。例如,如果启用了轮询模块,则Drupal应调用 poll_user_restriction_info() poll_metatags_info() (其中 hook_user_restriction_info() hook_metatags_info() 是我的模块使用的自定义钩子)在我的模块文件中存在。
我可以在我的模块中使用一个函数,该函数加载来自我的模块目录(例如poll_custom_hooks.inc)的文件,但我正在寻找一个系统,但我正在寻找一个允许drupal自动加载此类文件的系统。

英文原文

I have a module that should replace the implementation of a hook done by another module.
Is it possible to do it, with Drupal 7? If it is possible, under which conditions is possible?

By replacing the implementation of a hook done by another module, I mean using a function that is automatically called by Drupal when that module is enabled. For example, if the Poll module is enabled, then Drupal should call the poll_user_restriction_info() or the poll_metatags_info() (where hook_user_restriction_info() and hook_metatags_info() are custom hooks used by my module) function present in my module files.
I could use a function in my module that loads some include files from my module directory (e.g. poll_custom_hooks.inc) basing on the enabled modules, but I am looking for a system that would allow Drupal to automatically load such files.

     

回答列表

7
 
vote

您可以使用 hook_module_implements_alter()更改实现给定挂钩的模块列表。因此,只需在模块中实现钩子,然后从要替换的模块中删除其中一个。

请注意,此挂钩应非常仔细地使用,您可以使用它来做奇怪的东西,使其非常困​​难地保持和理解。

 

You can use hook_module_implements_alter() to alter the list of modules which implement a given hook. So just implement the hook in your module too and then remove the one from the module you want to replace.

Note that this hook should be used very carefully, you can do really weird stuff with it which will make it very hard to maintain and understand, among other things.

 
 
5
 
vote
vote
最佳答案
 

只有当模块在不是模块文件的文件中实现钩子时,并且想要覆盖该挂钩实现的模块在其模块文件中将其实现。在这种情况下,可以实现 hook_module_implements_alter()要向Drupal报告钩子实现未包含在外部文件中(即,挂钩实现包含在模块文件中)。

  function mymodule_module_implements_alter(&$implementations, $hook) {   if ($hook == 'token_info') {     $implementations['poll']['group'] = FALSE;   } }   

在挂钩实现的模块在模块文件中实现它的模块,然后在不改变该模块使用的文件的情况下,不可能执行任何操作,或者在包含该模块的目录中添加新文件需要"覆盖" 。原因是:

  • module_hook(),从 model_invoke()正在使用以下代码。

      function module_hook($module, $hook) {   $function = $module . '_' . $hook;   if (function_exists($function)) {     return TRUE;   }    // If the hook implementation does not exist, check whether it may live in an   // optional include file registered via hook_hook_info().   $hook_info = module_hook_info();   if (isset($hook_info[$hook]['group'])) {     module_load_include('inc', $module, $module . '.' . $hook_info[$hook]['group']);     if (function_exists($function)) {       return TRUE;     }   }   // ... }   

    此代码仅调用 module_hook_info() 仅当挂钩实现不在已从drupal加载的文件中,例如模块文件。由于 hook_module_implements_alter() 998876664 调用,这意味着在这种情况下,我的实现 hook_module_implements_alter() 不会被调用。

  • module_implements() ,函数由 <代码> module_invoke_all() 执行以下代码。

      foreach ($list as $module) {   $include_file = isset($hook_info[$hook]['group']) && module_load_include('inc', $module, $module . '.' . $hook_info[$hook]['group']);   // Since module_hook() may needlessly try to load the include file again,   // function_exists() is used directly here.   if (function_exists($module . '_' . $hook)) {     $implementations[$hook][$module] = $include_file ? $hook_info[$hook]['group'] : FALSE;   }   // ... }   

    代码正在寻找要在包含实现挂钩的模块的目录中加载文件。我的代码不能告诉Drupal在哪里寻找包含挂钩的文件,因此我可以将其放在文件下自动加载,例如我的模块的模块文件。

覆盖在模块文件中实现的模块挂钩在另一个模块文件中实现的函数不起作用,因为PHP将抱怨定义两次的函数。

 

It is only possible when the module is implementing the hook in a file that is not the module file, and the module that wants to override that hook implementation is implementing it in its module file. In this case, it is possible to implement hook_module_implements_alter() to report to Drupal that the hook implementation is not contained in an external file (i.e., the hook implementation is contained in the module file).

function mymodule_module_implements_alter(&$implementations, $hook) {   if ($hook == 'token_info') {     $implementations['poll']['group'] = FALSE;   } } 

In the case the module for which the hook implementation is being overwritten implements it in the module file, then it is impossible to do anything without altering the files used by that module, or adding a new file in the directory containing the module that needs to be "overwritten." The reason is that:

  • module_hook(), the function called from module_invoke() is using the following code.

    function module_hook($module, $hook) {   $function = $module . '_' . $hook;   if (function_exists($function)) {     return TRUE;   }    // If the hook implementation does not exist, check whether it may live in an   // optional include file registered via hook_hook_info().   $hook_info = module_hook_info();   if (isset($hook_info[$hook]['group'])) {     module_load_include('inc', $module, $module . '.' . $hook_info[$hook]['group']);     if (function_exists($function)) {       return TRUE;     }   }   // ... } 

    This code calls module_hook_info() only when the hook implementation is not in a file already loaded from Drupal, for example the module file. Since hook_module_implements_alter() is invoked by module_hook_info(), this means that in this case my implementation of hook_module_implements_alter() would not be invoked.

  • module_implements(), the function called by module_invoke_all() executes the following code.

    foreach ($list as $module) {   $include_file = isset($hook_info[$hook]['group']) && module_load_include('inc', $module, $module . '.' . $hook_info[$hook]['group']);   // Since module_hook() may needlessly try to load the include file again,   // function_exists() is used directly here.   if (function_exists($module . '_' . $hook)) {     $implementations[$hook][$module] = $include_file ? $hook_info[$hook]['group'] : FALSE;   }   // ... } 

    The code is looking for the file to load in the directory containing the module implementing the hook. My code cannot tell Drupal where to look for the file containing the hook, so I could just put it in a file Drupal automatically loads, such as the module file of my module.

Overriding a module hook implemented in a module file with a function implemented in another module file does not work, as PHP would complain about a function defined twice.

 
 

相关问题

3  我可以使用规则模块向所选节点的作者发送大量电子邮件吗?  ( Can i use the rules module to send mass emails to authors of selected nodes ) 
如何利用规则模块来查找CCK字段具有特定的节点value,并且在找到时,通过电子邮件发送电子邮件? 例如,如果我希望人们在添加新的CCK字段时登录并更新他们的个人资料,我将如何做到这一点? ...

3  基于提交按钮值重定向节点形式  ( Node form redirect based on submit button value ) 
我已经读取并尝试了几种方法来重定向表单一旦提交。但是,如果操作是t("保存" ),我只想重定向节点表单。 如果我设置$ form ['#redirect'] = form_alter中的'blah',它将重定向所有类型的表单。如果我添加提交处理程序然后设置$ form_state ['重定向'],它只是被drupal...

2  模块如何检查Drupal是否显示其中一个更新页面?  ( How can a module check if drupal is showing one of the update pages ) 
模块应该如何验证Drupal是否正在更新数据库表,以避免在显示更新页面之一时输出消息(或避免在更新期间执行任何多余的任务)? 我正在参考的模块是一个自定义调试模块,在每个请求的页面上进行一些测试,并使用 drupal_set_message() 输出结果。 ...

1  模块可以知道其一个块是否正在仪表板上输出时,并更改该块的内容?  ( Is possible for a module to know when one of its blocks is being output on the d ) 
drupal 7有一个新的核心模块(仪表板))允许用户具有右权限的用户将从第三方站点定义的块添加到仪表板,如当前页面上的叠加。 是一个模块可以实现块以知道何时在仪表板上呈现块? 这个想法是改变块的内容,并使其更小(例如)。 ...

14  Drupal 7处理JavaScript和jQuery的方式变化  ( Changes in the way drupal 7 handles javascript and jquery ) 
我目前正在开发一个在管理页面上运行的javascript脚本。我介绍了Drupal 7所做的更改,即从 document.ready() 的移动到自己的jQuery函数。但是,以下脚本不起作用。 (function ($) { console.log('hello'); $('#edit-apiusern...

8  分类面包屑  ( Taxonomy breadcrumbs ) 
我正在使用博客标签的核心分类模块,但是在标签的页面上只能得到面包屑出现为"家" ,而我会喜欢它理想情况下是'家庭&gt;博客&gt; #标签#'。我正在使用自定义面包卷模块来设置内容类型的面包屑(&lt; - 不允许分类库),并尝试使用分类面包屑模块​​绝对不会产生,部分原因是它不是特别可配置的模块。博客标记页面(...

4  是否可以仅在内容类型语言中性中制作一个字段?  ( Is it possible to make only one field in a content type language neutral ) 
如果您有文本字段,则您不想被翻译(即语言中性),如电子邮件地址的字段中,您如何将一个字段设置为语言中性,同时离开其余部分内容类型中的字段多语言(启用,在工作流设置下的翻译)?我尝试在"内容翻译" 下切换复选框,但我认为这只是为了翻译管理模块翻译作业处理程序,而不是实际的现场设置本身。 这个想法是不必在两次中输入两次电...

6  我应该如何处理容器表单元素?  ( How should i handle container form elements ) 
我已将一些自定义字段添加到寄存器用户表单中,我发现它们被发送回,包装在"容器" 类型元素中。我的代码需要处理所有类型的自定义寄存器字段。 我该如何解析这些对象并从中提取字段?我应该调查阵列,我可以在那里找到什么? 我似乎无法在这些对象上找到任何好的文档。 编辑: 通过用户注册收到的常规字段可能如下所示: na...

17  如何删除某些元标记?  ( How to remove certain meta tags ) 
如何从Drupal 7中的页面中删除这些标签? <link rel="shortlink" href=" .... " /> <meta name="Generator" content="Drupal 7 (http://drupal.org)" /> <link rel="canonical" href="....

1  如何在网站的每页上使用视图筛选表单创建块?  ( How to create a block with views filter form available on each page of the site ) 
这适用于一个小房地产局的网站。 我有一个 property_offer 内容类型设置和优惠类型词汇,有4个术语(购买,销售,卖出租赁和承担租约)。然后我已经创建了一个与页面显示的视图,对于网站的首页,它列出了所有优惠,还有4个术语中的每一个页面。 如何为此视图创建公开的过滤器,这必须作为块可用,以便我可以将其放在站点...

7  如何将系统联系表单消息发送处理并改变生成的HTML?  ( How can i hook into the system contact form message sent process and alter the h ) 
我有一个drupal网站,我正在使用涉及范围的系统联系,以允许访问者向网站所有者发送消息。一旦访问者提交表单,用户将被重定向到主页,并且顶部读数出现粘性: 您的邮件已发送。 我的问题,是可以更改此消息并将一些HTML添加到输出吗?理想情况下,我会添加一些JavaScript来为Google Analytics帐户...

4  将物品放在菜单中的多个地方  ( Putting items in multiple places in a menu ) 
我正在尝试设置一个菜单布局,它有两个链接到 /biblio ;一个在"研究人员" 下,一个"工作人员" 。这是为了方便起见,仿佛您在"工作人员" 下,"研究人员" 封闭式,"员工" 子菜单不可用于未注册的用户。我运行的问题是,虽然我可以在菜单的不同部分中有两个链接,但在查看页面时,它将始终尝试将菜单打开到其中一个。这...

11  在hook_install上创建新的内容类型  ( Create new content type on hook install ) 
可以有人向我展示如何在模块的 hook_install 方法? 我还想知道 hook_uninstall 清理我的混乱;我读了一些关于只删除内容的争论。 我没有找到正确完成此任务的正确方法的示例,任何帮助都会受到赞赏! ...

3  加载特定节点修订版视图  ( Loading a specific node revision for view ) 
我试图加载特定的修订版以通过最终用户查看。 Drupal 7. 我在我的.module中有以下内容; function mymodule_node_load($nodes, $types) { if ($nodes[821]->vid != 5928) { $nodes[821] = node_l...

1  如果创建,则显示相关分类列表  ( Show related taxonomy list if created ) 
我创造了以下建设。如果学生选择选项a与如果施工中的如果巫师下一步是医学领域的实习,但如果学校创造了另一种药物域B.与这个建设一起学生只会看到实习领域A而不是医学领域A和B.我正在寻找一个与我的分类学生长的建筑物(显示医学领域A和B,如果学校创造5个月后,学生也必须看到的药物域名,所以如果学生比他选择药物获取所有医学域...

3  列出与节点参考字段有关的书籍概要  ( List outline of books related to another book by a node reference field ) 
我正在使用具有四种内容类型的书模块:a,b,c和d。 a是子页面的内容类型,其余的是在书概述中允许。 我还有一个节点参考字段,允许用户选择与他们正在创建的类型的类型的节点。 我正在尝试使用视图来显示与某个类型的节点相关的所有节点,并显示这些相关节点的轮廓。 e.g。查看书A.1相关主题及其轮廓: 书a.1 书...

3  改变NodeComment $ Links  ( Altering nodecomment links ) 
我正在尝试在主题下面列出节点时更改添加到NodeComment注释的"回复" 链接。我所拥有的问题是我希望用户仅限于内联提交表单,但是NodeComment正在将链接添加到独立回复页面。 在尝试使用hook_link_alter()中的链接时,我遇到了一个问题,其中NodeComment注释是很多像普通注释那样的常...

7  如何访问分类学期的字段?  ( How do i access a taxonomy terms fields ) 
具体而言,我正在尝试访问一个名为'徽标'的字段,在几个分类术语(推文和维基百科编辑)中,这是一个图像。我在我的网站的首页上有一个新闻源,并且对于每个饲料项目,该馈电项目在馈送中的每个馈送项目旁边具有术语引用。关于暴露或访问每个分类学术语的最佳方法是什么? ...

6  我可以使用简单的XML来馈送视图吗?  ( Can i use simple xml to feed views ) 
我想使用视图的力量来处理我的数据,这是一个只有网格resp table 的简单XML。 <list> <listpos id="12312"> <foo>attr1</foo> <bar>attr bar</bar> ... </listpos> <listpos id="12...

3  通过创建或扩展实体开发幻想体育管理系统是有意义的吗?  ( Does it make sense to develop a fantasy sports management system by creating or ) 
我正在考虑用Drupal建立一个幻想体育管理系统。系统将需要内容,因此请使用标准的Drupal系统处理。但是,它是否有意义(甚至是可能的),以创造代表玩家,团队,联赛,统计线等的新实体? 我在过去(.NET)中建立了这样的系统,我很难围绕与玩家,团队和统计数据相结合的内容节点的想法。有许多字段是每种类型的节点/实体,...




© 2021 it.wenda123.org All Rights Reserved. 问答之家 版权所有


Licensed under cc by-sa 3.0 with attribution required.