hook_form_alter执行顺序


10

有没有一种方法可以在Drupal 7中更改hook_form_alter的执行顺序,而无需更改模块的权重或对Drupal Core进行黑客攻击?

我正在尝试从翻译模块更改在translation_form_node_form_alter中添加的元素。在调试表单时,我找不到元素,因此我假设我的钩子在翻译模块中的钩子之前执行。

Answers:


2

我不这么认为。我相信会在之后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_alter()之后调用hook_form_FORM_ID_alter()
iStryker

使用hook_form_form_id_alter和模块权重解决了它。
巴特

@Bart(如果您使用过),hook_form_FORM_ID_alter()那么我的理解是,您根本不需要修改权重(因为所有的hook_form_FORM_ID_alter()调用毕竟都是hook_form_BASE_FORM_ID_alter())。
安迪(Andy)

@Andy,如果我在不调整权重的情况下使用foo_form_page_node_form_alter,这似乎不起作用。
巴特

1
@Bart我正在查看源代码,以为您提供这些详细信息-请查看drupal_prepare_form()和的底部drupal_alter()。我已经注意到文档似乎不存在,所以我创建了一个问题。不知道为什么不更改系统重量就对您不起作用!
安迪

17

还值得一提的是,有一个新的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;
  }
}
?>

我能够使用此确切的代码最后执行我的钩子。谢谢!

4

这是确保如何在另一个模块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的示例很有用


没为我工作。
Achraf JEDAY'7
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.