Ausführungsreihenfolge von hook_form_alter

10

Gibt es eine Möglichkeit, die Ausführungsreihenfolge von hook_form_alter in Drupal 7 zu ändern, ohne das Gewicht eines Moduls zu ändern oder Drupal Core zu hacken?

Ich versuche, das in translation_form_node_form_alter hinzugefügte Element aus dem Übersetzungsmodul zu ändern . Beim Debuggen des Formulars kann ich das Element nicht finden, daher gehe ich davon aus, dass mein Hook vor dem im Übersetzungsmodul ausgeführt wird.

Bart
quelle

Antworten:

2

Das glaube ich nicht. translation_form_node_form_alter()Geräte , hook_form_BASE_FORM_ID_alter()die ich glaube , genannt nach hook_form_alter() , so dass auch das Modulgewicht würden nicht ausreichen , um zu ändern. Ich denke, Ihre beiden Optionen sind die Verwendung von a hook_form_BASE_FORM_ID_alter()und die Sicherstellung, dass Sie ein ausreichend hohes Modulgewicht haben, oder die Verwendung hook_form_FORM_ID_alter()(wenn möglich).

Andy
quelle
hook_form_FORM_ID_alter () wird nach hook_form_alter ()
aufgerufen
Es wurde mit hook_form_form_id_alter und Modulgewicht gelöst.
Bart
@Bart Wenn Sie verwendet haben, hook_form_FORM_ID_alter()ist mein Verständnis, dass Sie das Gewicht überhaupt nicht ändern müssen (weil schließlich alle hook_form_FORM_ID_alter()Anrufe getätigt werden hook_form_BASE_FORM_ID_alter()).
Andy
@Andy, es scheint nicht zu funktionieren, wenn ich foo_form_page_node_form_alter verwende, ohne das Gewicht anzupassen.
Bart
1
@Bart Ich habe mir die Quelle angesehen, um Ihnen diese Details zu geben - sehen Sie sich den unteren Rand von drupal_prepare_form()und an drupal_alter(). Ich hatte bereits bemerkt, dass die Dokumente deaktiviert waren, also habe ich ein Problem erstellt . Keine Ahnung, warum es bei Ihnen nicht funktioniert, ohne das Systemgewicht zu ändern!
Andy
17

Erwähnenswert ist auch, dass es eine neue Drupal 7-API namens hook_module_implements_alter () gibt, mit der Sie die Ausführungsreihenfolge für einen bestimmten Hook ändern können, ohne die Modulgewichtstabelle zu ändern.

Beispielcode aus den API-Dokumenten, der zeigt, wie einfach dies ist:

<?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
quelle
Ich konnte meinen Hook zuletzt mit genau diesem Code ausführen. Vielen Dank!
Beau
4

So stellen Sie sicher, dass Ihr hook_form_alter nach einem anderen Modul aufgerufen wird 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;
  }
}

Dies funktioniert auch, wenn das andere Modul einen form_alter-Hook in der Variation: hook_form_FORM_ID_alter bereitgestellt hat. (Sie erklären das in der Dokumentation: hook_module_implements_alter ).

Ich weiß, dass dieser Beitrag dem Beitrag von wiifm ziemlich ähnlich ist, fand ihn aber mit einem Beispiel mit hook_form_alter nützlich

rosell.dk
quelle
Hat bei mir nicht funktioniert.
Achraf JEDAY