hook_form_alter ordine di esecuzione


10

C'è un modo per cambiare l'ordine di esecuzione di hook_form_alter in Drupal 7 senza cambiare il peso di un modulo o hackerare 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.

Risposte:


2

Io non la penso così. translation_form_node_form_alter()strumenti hook_form_BASE_FORM_ID_alter()che credo siano chiamati dopo hook_form_alter() , quindi anche cambiare il peso del modulo non sarebbe sufficiente. Penso che le tue due opzioni siano usare un 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).


hook_form_FORM_ID_alter () Viene chiamato dopo hook_form_alter ()
iStryker il

Risolto usando hook_form_form_id_alter e peso del modulo.
Bart,

@Bart se hai usato, hook_form_FORM_ID_alter()quindi la mia comprensione è che non dovresti modificare affatto il peso (perché tutte le hook_form_FORM_ID_alter()chiamate vengono fatte dopo tutto hook_form_BASE_FORM_ID_alter()).
Andy,

@Andy, non sembra funzionare se uso foo_form_page_node_form_alter senza regolare il peso.
Bart,

1
@Bart Stavo guardando la fonte per darti quei dettagli - controlla il fondo di drupal_prepare_form()e drupal_alter(). Avevo già notato che i documenti sembravano disattivati, quindi ho creato un problema . Non so perché non funziona per te senza alterare il peso del sistema!
Andy,

17

Vale anche la pena ricordare che esiste una nuova API drupal 7 chiamata hook_module_implements_alter () che consente di modificare l'ordine di esecuzione di un determinato hook SENZA modificare 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;
  }
}
?>

Sono stato in grado di eseguire il mio hook per ultimo con questo codice esatto. Grazie!
Beau,

4

Ecco come assicurarsi che hook_form_alter venga 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


Non ha funzionato per me.
Achraf JEDAY
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.