kolejność wykonywania hook_form_alter

10

Czy istnieje sposób na zmianę kolejności wykonywania hook_form_alter w Drupal 7 bez zmiany wagi modułu lub włamania się do Drupal Core?

Próbuję zmienić element dodany w module_forma_węzła_formatowania z modułu tłumaczącego. Podczas debugowania formularza nie mogę znaleźć elementu, więc zakładam, że mój hak jest wykonywany przed tym w module tłumaczącym.

Bart
źródło

Odpowiedzi:

2

Nie wydaje mi się translation_form_node_form_alter()narzędzia hook_form_BASE_FORM_ID_alter(), które moim zdaniem jest nazywany po hook_form_alter() , więc nawet zmiany masy modułu nie wystarczy. Myślę, że dwie opcje to użycie hook_form_BASE_FORM_ID_alter()i upewnienie się, że masz wystarczająco wysoką masę modułu lub użycie hook_form_FORM_ID_alter()(jeśli to możliwe).

Andy
źródło
hook_form_FORM_ID_alter () JEST wywoływany po hook_form_alter ()
iStryker
Rozwiązano go za pomocą hook_form_form_id_alter i masy modułu.
Bart
@Bart, jeśli używałeś, hook_form_FORM_ID_alter()to rozumiem, że nie powinieneś w ogóle musieć modyfikować wagi (ponieważ w końcu wszystkie hook_form_FORM_ID_alter()połączenia są wykonywane hook_form_BASE_FORM_ID_alter()).
Andy,
@Andy, to nie wydaje się działać, jeśli użyję foo_form_page_node_form_alter bez regulacji wagi.
Bart
1
@ Bart Patrzyłem na źródło, aby podać te szczegóły - sprawdź na dole drupal_prepare_form()i drupal_alter(). Już zauważyłem, że dokumenty wydawały się wyłączone, więc stworzyłem problem . Nie wiem, dlaczego to nie działa bez zmiany wagi systemu!
Andy
17

Warto również wspomnieć, że istnieje nowy interfejs API drupal 7 o nazwie hook_module_implements_alter (), który pozwala zmienić kolejność wykonywania danego haka WIHOUT zmieniając tabelę wag modułu.

Przykładowy kod z dokumentacji API pokazujący, jak łatwo to zrobić:

<?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;
  }
}
?>
wiifm
źródło
Byłem w stanie wykonać mój hak na końcu z tym dokładnym kodem. Dzięki!
Beau
4

Oto jak upewnić się, że Twój hook_form_alter jest wywoływany po innych modułach 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;
  }
}

Działa to również wtedy, gdy drugi moduł podał hak form_alter w wariancie: hook_form_FORM_ID_alter. (wyjaśniają to w dokumentacji: hook_module_implements_alter ).

Wiem, że ten post jest dość podobny do postu wiifm, ale pomyślałem, że jest przydatny na przykładzie z hook_form_alter

rosell.dk
źródło
Nie działało dla mnie.
Achraf WTOREK