ordem de execução hook_form_alter

10

Existe uma maneira de alterar a ordem de execução de hook_form_alter no Drupal 7 sem alterar o peso de um módulo ou invadir o Drupal Core?

Estou tentando alterar o elemento adicionado em translation_form_node_form_alter do módulo de tradução. Ao depurar o formulário, não consigo encontrar o elemento, portanto, suponho que meu gancho esteja sendo executado antes do do módulo de tradução.

Bart
fonte

Respostas:

2

Acho que não. translation_form_node_form_alter()implementos hook_form_BASE_FORM_ID_alter()que acredito serem chamados depois hook_form_alter() , portanto, mesmo alterar o peso do módulo não seria suficiente. Eu acho que suas duas opções são usar um hook_form_BASE_FORM_ID_alter()e garantir que você tenha um peso de módulo alto o suficiente, ou usar hook_form_FORM_ID_alter()(se possível).

Andy
fonte
hook_form_FORM_ID_alter () é chamado após hook_form_alter ()
iStryker
Resolvido usando hook_form_form_id_alter e o peso do módulo.
26411 Bart Bart
@ Bart, se você usou hook_form_FORM_ID_alter(), entendo que você não precisa modificar o peso (porque todas as hook_form_FORM_ID_alter()chamadas são feitas, afinal hook_form_BASE_FORM_ID_alter()).
217 Andy
@ Andy, não parece funcionar se eu usar foo_form_page_node_form_alter sem ajustar o peso.
Bart
1
@ Bart eu estava olhando a fonte para lhe dar esses detalhes - confira a parte inferior drupal_prepare_form()e drupal_alter(). Eu já tinha notado que os documentos pareciam errados, então criei um problema . Não sei por que não funciona para você sem alterar o peso do sistema!
217 Andy
17

Também vale mencionar, existe uma nova API do drupal 7 chamada hook_module_implements_alter () que permite alterar a ordem de execução de um determinado gancho SEM alterar a tabela de pesos do módulo.

Código de exemplo dos documentos da API, mostrando como isso é fácil:

<?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
fonte
Consegui executar meu último gancho com este código exato. Obrigado!
Beau
4

Aqui está como garantir que seu hook_form_alter seja chamado após outros módulos 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;
  }
}

Isso também funciona quando o outro módulo forneceu um gancho form_alter na variação: hook_form_FORM_ID_alter. (eles explicam isso na documentação: hook_module_implements_alter ).

Eu sei que este post é bastante semelhante ao post de wiifm, mas achei útil com um exemplo com hook_form_alter

rosell.dk
fonte
Não funcionou para mim.
Achraf JEDAY