hook_form_alter実行順序


10

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

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

回答:


2

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


hook_form_FORM_ID_alter()はhook_form_alter()の後に呼び出されます
iStryker '26 / 07/26

hook_form_form_id_alterとモジュールの重みを使用して解決しました。
Bart

@Bartを使用したhook_form_FORM_ID_alter()場合、私の理解は、重みをまったく変更する必要がないことです(すべてのhook_form_FORM_ID_alter()呼び出しが結局行われるためhook_form_BASE_FORM_ID_alter())。
アンディ

@Andy、重みを調整せずにfoo_form_page_node_form_alterを使用すると機能しないようです。
Bart

1
@Bart私はあなたにそれらの詳細を与えるためにソースを見ていました- drupal_prepare_form()との底をチェックしてくださいdrupal_alter()。ドキュメントが不明瞭になっていることにすでに気付いていたため、問題作成しました。システムの重量を変更しないと機能しないのはなぜですか?
アンディ

17

また、言及する価値があります。モジュールの重みテーブルを変更する特定のフックの実行順序を変更できるhook_module_implements_alter()と呼ばれる新しいdrupal 7 APIがあります。

これがいかに簡単かを示す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 2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.