Problem:
Potrzebujesz aby Twój moduł wywoływał hook_form_alter jako ostatni - ma operować na formularzu już gotowym, przetworzonym przez wszystkie inne moduły.
Rozwiązaniem jest ustawienie kolejności wywołań danego hooka.
w D6 dało się to zrobić edytując bazę danych, co nie było zbyt elastycznym i eleganckim rozwiązaniem. Na szczęście w D7 stworzono hook_module_implements_alter który pozwala na kontrolę kolejności wywołań danego hooka przez określone przez programistę moduły.
W najprostszej wersji wystarczy podać tylko nasz moduł i będzie on wtedy ustawiony na końcu kolejki.
Ponieważ sama dokumentacja hooka nie jest zbyt bogata polecam świetny tutorial na ten temat.
Rozwiązanie to działa w moim przypadku, gdzie musiałem wywołać hook_form_alter() swojego modułu po tym jak Profile2 dodał swoje pola do formularza rejestracji użytkownika.
Potrzebujesz aby Twój moduł wywoływał hook_form_alter jako ostatni - ma operować na formularzu już gotowym, przetworzonym przez wszystkie inne moduły.
Rozwiązaniem jest ustawienie kolejności wywołań danego hooka.
w D6 dało się to zrobić edytując bazę danych, co nie było zbyt elastycznym i eleganckim rozwiązaniem. Na szczęście w D7 stworzono hook_module_implements_alter który pozwala na kontrolę kolejności wywołań danego hooka przez określone przez programistę moduły.
W najprostszej wersji wystarczy podać tylko nasz moduł i będzie on wtedy ustawiony na końcu kolejki.
Ponieważ sama dokumentacja hooka nie jest zbyt bogata polecam świetny tutorial na ten temat.
Rozwiązanie to działa w moim przypadku, gdzie musiałem wywołać hook_form_alter() swojego modułu po tym jak Profile2 dodał swoje pola do formularza rejestracji użytkownika.
/**
* Implements hook_module_implements_alter()
*/
function alter_register_worker_module_implements_alter(&$implementations, $hook) {
//Any change here requires Caches to be cleared.
//dpm($implementations);
switch ($hook) {
case 'form_alter':
$m1 = $implementations['mojmodul'];
unset($implementations['mojmodul']);
$implementations['mojmodul'] = $m1;
break;
}
//dpm($implementations);
}
Jeśli odkomentujesz funkcje dpm() wyswietli się kolejność modułów - przed i po naszej implementacji.
* Implements hook_module_implements_alter()
*/
function alter_register_worker_module_implements_alter(&$implementations, $hook) {
//Any change here requires Caches to be cleared.
//dpm($implementations);
switch ($hook) {
case 'form_alter':
$m1 = $implementations['mojmodul'];
unset($implementations['mojmodul']);
$implementations['mojmodul'] = $m1;
break;
}
//dpm($implementations);
}
Komentarze
Prześlij komentarz