有没有一种方法可以在Drupal 7中更改hook_form_alter的执行顺序,而无需更改模块的权重或对Drupal Core进行黑客攻击?
我正在尝试从翻译模块更改在translation_form_node_form_alter中添加的元素。在调试表单时,我找不到元素,因此我假设我的钩子在翻译模块中的钩子之前执行。
有没有一种方法可以在Drupal 7中更改hook_form_alter的执行顺序,而无需更改模块的权重或对Drupal Core进行黑客攻击?
我正在尝试从翻译模块更改在translation_form_node_form_alter中添加的元素。在调试表单时,我找不到元素,因此我假设我的钩子在翻译模块中的钩子之前执行。
Answers:
我不这么认为。我相信会在之后translation_form_node_form_alter()
实现的实现,因此,即使更改模块权重也是不够的。我认为您的两个选择是使用a 并确保您具有足够高的模块重量,或者使用(如果可能)。hook_form_BASE_FORM_ID_alter()
hook_form_alter()
hook_form_BASE_FORM_ID_alter()
hook_form_FORM_ID_alter()
hook_form_FORM_ID_alter()
那么我的理解是,您根本不需要修改权重(因为所有的hook_form_FORM_ID_alter()
调用毕竟都是hook_form_BASE_FORM_ID_alter()
)。
drupal_prepare_form()
和的底部drupal_alter()
。我已经注意到文档似乎不存在,所以我创建了一个问题。不知道为什么不更改系统重量就对您不起作用!
还值得一提的是,有一个新的drupal 7 API,称为hook_module_implements_alter(),可让您更改给定挂钩的执行顺序,从而更改模块权重表。
API文档中的示例代码显示了这样做的难度:
<?php
function hook_module_implements_alter(&$implementations, $hook) {
if ($hook == 'rdf_mapping') {
// Move my_module_rdf_mapping() to the end of the list. module_implements()
// iterates through $implementations with a foreach loop which PHP iterates
// in the order that the items were added, so to move an item to the end of
// the array, we remove it and then add it.
$group = $implementations['my_module'];
unset($implementations['my_module']);
$implementations['my_module'] = $group;
}
}
?>
这是确保如何在另一个模块hook_form_alter之后调用hook_form_alter的方法:
/**
* Implements hook_form_alter().
*/
function my_module_form_alter(&$form, &$form_state, $form_id) {
// do your stuff
}
/**
* Implements hook_module_implements_alter().
*
* Make sure that our form alter is called AFTER the same hook provided in xxx
*/
function my_module_module_implements_alter(&$implementations, $hook) {
if ($hook == 'form_alter') {
// Move my_module_rdf_mapping() to the end of the list. module_implements()
// iterates through $implementations with a foreach loop which PHP iterates
// in the order that the items were added, so to move an item to the end of
// the array, we remove it and then add it.
$group = $implementations['my_module'];
unset($implementations['my_module']);
$implementations['my_module'] = $group;
}
}
当另一个模块在以下版本中提供了一个form_alter钩子时,该方法也适用:hook_form_FORM_ID_alter。(他们在文档中对此进行了说明:hook_module_implements_alter)。
我知道这篇文章与wiifm的文章非常相似,但是认为它对于带有hook_form_alter的示例很有用