ordre d'exécution hook_form_alter

10

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.

Bart
la source

Réponses:

2

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

Andy
la source
hook_form_FORM_ID_alter () EST appelé après hook_form_alter ()
iStryker
Résolu en utilisant hook_form_form_id_alter et le poids du module.
Bart
@Bart si vous l'avez utilisé, hook_form_FORM_ID_alter()je crois que vous ne devriez pas du tout avoir à modifier le poids (car tous les hook_form_FORM_ID_alter()appels sont effectués après tout hook_form_BASE_FORM_ID_alter()).
Andy
@Andy, cela ne semble pas fonctionner si j'utilise foo_form_page_node_form_alter sans ajuster le poids.
Bart
1
@Bart Je cherchais la source pour vous donner ces détails - consultez le bas de drupal_prepare_form()et drupal_alter(). J'avais déjà remarqué que les documents semblaient éteints, j'ai donc créé un problème . Vous ne savez pas pourquoi cela ne fonctionne pas pour vous sans modifier le poids du système!
Andy
17

Il convient également de mentionner, il existe une nouvelle API drupal 7 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;
  }
}
?>
wiifm
la source
J'ai pu exécuter mon hook en dernier avec ce code exact. Merci!
Beau
4

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

rosell.dk
la source
Ça n'a pas marché pour moi.
Achraf JEDAY