web-dev-qa-db-fra.com

ordre d'exécution hook_form_alter

Existe-t-il un moyen de changer l'ordre d'exécution de hook_form_alter dans Drupal 7 sans changer le poids d'un module ou pirater Drupal Core?

J'essaie de modifier l'élément ajouté dans translation_form_node_form_alter à partir du module de traduction. Lors du débogage du formulaire, je ne trouve pas l'élément, donc je suppose que mon hook est en cours d'exécution avant celui du module de traduction.

10
Bart

Je ne pense pas. translation_form_node_form_alter() implémente hook_form_BASE_FORM_ID_alter() qui je crois s'appelle aprèshook_form_alter(), donc même changer le poids du module ne serait pas suffisant. Je pense que vos deux options sont d'utiliser une hook_form_BASE_FORM_ID_alter() et de vous assurer que vous avez un poids de module suffisamment élevé, ou d'utiliser hook_form_FORM_ID_alter() (si possible).

2
Andy

Il convient également de mentionner, il existe une nouvelle drupal 7 API appelée hook_module_implements_alter () qui vous permet de modifier l'ordre d'exécution pour un crochet donné SANS modifier la table des poids du module.

Exemple de code à partir des documents de l'API montrant à quel point cela est facile:

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

Voici comment vous assurer que votre hook_form_alter est appelé après un autre module 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;
  }
}

Cela fonctionne également lorsque l'autre module a fourni un crochet form_alter dans la variante: hook_form_FORM_ID_alter. (ils expliquent cela dans la documentation: hook_module_implements_alter ).

Je sais que ce message est assez similaire au message de wiifm, mais l'a trouvé utile avec un exemple avec hook_form_alter

4
rosell.dk