it-swarm.it

hook_form_alter ordine di esecuzione

C'è un modo per cambiare l'ordine di esecuzione di hook_form_alter in Drupal 7 senza cambiare il peso di un modulo o l'hacking Drupal Core?

Sto cercando di modificare l'elemento aggiunto in translation_form_node_form_alter dal modulo di traduzione. Durante il debug del modulo non riesco a trovare l'elemento, quindi presumo che il mio hook sia eseguito prima di quello nel modulo di traduzione.

10
Bart

Io non la penso così. translation_form_node_form_alter() implementa hook_form_BASE_FORM_ID_alter() che credo sia chiamato afterhook_form_alter(), quindi anche cambiare il peso del modulo non sarebbe sufficiente. Penso che le tue due opzioni siano usare una hook_form_BASE_FORM_ID_alter() e assicurarti di avere un peso del modulo abbastanza alto, o usare hook_form_FORM_ID_alter() (se possibile).

2
Andy

Vale anche la pena ricordare che esiste una nuova drupal 7 API chiamata hook_module_implements_alter () che consente di modificare l'ordine di esecuzione di un determinato hook SENZA alterare la tabella dei pesi del modulo.

Codice di esempio dai documenti API che mostra quanto sia facile farlo:

<?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

Ecco come assicurarsi che il tuo hook_form_alter sia chiamato dopo un altro modulo 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;
  }
}

Questo funziona anche quando l'altro modulo ha fornito un hook form_alter nella variante: hook_form_FORM_ID_alter. (spiegano che nella documentazione: hook_module_implements_alter ).

So che questo post è abbastanza simile al post di wiifm, ma lo ha ritenuto utile con un esempio con hook_form_alter

4
rosell.dk