web-dev-qa-db-ja.com

hook_form_alter実行順序

Drupal 7でhook_form_alterの実行順序をモジュールの重みを変更したりハッキングしたりせずに変更する方法はありますかDrupal Core?

翻訳モジュールから translation_form_node_form_alter に追加された要素を変更しようとしています。フォームをデバッグするときに要素が見つからないため、翻訳モジュールのフックが実行される前にフックが実行されていると思います。

10
Bart

私はそうは思いません。 translation_form_node_form_alter()hook_form_BASE_FORM_ID_alter()を実装していると思いますafterhook_form_alter()と呼ばれるため、モジュールの重みを変更するだけでは不十分です。私はあなたの2つのオプションはhook_form_BASE_FORM_ID_alter()を使用して十分なモジュールの重みがあることを確認するか、またはhook_form_FORM_ID_alter()を使用することです(可能な場合)。

2
Andy

また言及する価値があります。モジュールの重みテーブルを変更する特定のフックの実行順序を変更できる、新しい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;
  }
}
?>
17
wiifm

他のモジュール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の例を参考にすると便利です

4
rosell.dk